Проблема с соединением Pandas: столбцы перекрываются, но не указан суффикс


137

У меня есть следующие 2 фрейма данных:

df_a =

     mukey  DI  PI
0   100000  35  14
1  1000005  44  14
2  1000006  44  14
3  1000007  43  13
4  1000008  43  13

df_b = 
    mukey  niccdcd
0  190236        4
1  190237        6
2  190238        7
3  190239        4
4  190240        7

Когда я пытаюсь объединить эти 2 фрейма данных:

join_df = df_a.join(df_b,on='mukey',how='left')

Я получаю сообщение об ошибке:

*** ValueError: columns overlap but no suffix specified: Index([u'mukey'], dtype='object')

Почему это так? Фреймы данных имеют общие значения mukey.

Ответы:


148

Ваша ошибка в опубликованном вами фрагменте данных немного загадочна, поскольку из-за отсутствия общих значений операция соединения завершается неудачно, поскольку значения не перекрываются, поэтому вам необходимо указать суффикс для левой и правой стороны:

In [173]:

df_a.join(df_b, on='mukey', how='left', lsuffix='_left', rsuffix='_right')
Out[173]:
       mukey_left  DI  PI  mukey_right  niccdcd
index                                          
0          100000  35  14          NaN      NaN
1         1000005  44  14          NaN      NaN
2         1000006  44  14          NaN      NaN
3         1000007  43  13          NaN      NaN
4         1000008  43  13          NaN      NaN

merge работает, потому что у него нет этого ограничения:

In [176]:

df_a.merge(df_b, on='mukey', how='left')
Out[176]:
     mukey  DI  PI  niccdcd
0   100000  35  14      NaN
1  1000005  44  14      NaN
2  1000006  44  14      NaN
3  1000007  43  13      NaN
4  1000008  43  13      NaN

32

.join()Функция использует indexиз передается в качестве аргумента набора данных, поэтому вы должны использовать set_indexили использовать .mergeфункцию вместо этого.

Найдите два примера, которые должны работать в вашем случае:

join_df = LS_sgo.join(MSU_pi.set_index('mukey'), on='mukey', how='left')

или

join_df = df_a.merge(df_b, on='mukey', how='left')

27

Эта ошибка указывает на то, что две таблицы имеют 1 или несколько имен столбцов с одинаковыми именами столбцов. Сообщение об ошибке переводится как «Я вижу один и тот же столбец в обеих таблицах, но вы не сказали мне переименовать ни один из них, прежде чем ввести один из них».

Вы либо хотите удалить один из столбцов, прежде чем переносить его из другого, используя del df ['имя столбца'], либо использовать lsuffix, чтобы перезаписать исходный столбец, либо rsuffix, чтобы переименовать тот, который ему передается.

df_a.join(df_b, on='mukey', how='left', lsuffix='_left', rsuffix='_right')

1

В основном объединение используется исключительно для объединения на основе индекса, а не имен атрибутов, поэтому измените имена атрибутов в двух разных фреймах данных, затем попробуйте объединиться, они будут объединены, иначе возникает эта ошибка

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.