Панды: объединить (объединить) два фрейма данных в нескольких столбцах

169

Я пытаюсь соединить два фрейма данных панд, используя два столбца:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

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

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4164)()

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4028)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13166)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13120)()

KeyError: '[B_1, c2]'

Есть идеи, каким должен быть правильный способ сделать это? Спасибо!

Edamame
источник
53
left_onи right_onдолжен быть списком строк, а не строкой, которая выглядит как список.
root

Ответы:

313

Попробуй это

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

left_on: метка или список, или массивы, как имена полей для объединения в левом DataFrame. Может быть вектором или списком векторов длины DataFrame для использования определенного вектора в качестве ключа соединения вместо столбцов

right_on: метка или список, или массивы, подобные именам полей, для объединения в правый DataFrame или вектор / список векторов в документах left_on

Shijo
источник
8
Если left_onи right_onтак же, aи bмы можем использовать on = ['a', 'b']?
Ахбон
4
Да, это совершенно верно.
user3065757
4

проблема здесь в том, что, используя апострофы, вы устанавливаете передаваемое значение как строку, тогда как на самом деле, как сказано в документации @Shijo, функция ожидает метку или список, но не строку! Если список содержит каждое имя существа столбцов, переданное как для левого, так и для правого кадра данных, то каждое имя столбца должно быть отдельно в апострофах. Из сказанного мы можем понять, почему это не так:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

И это правильный способ использования функции:

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])
Целиус Стингер
источник
3

Еще один способ сделать это: new_df = A_df.merge(B_df, left_on=['A_c1','c2'], right_on = ['B_c1','c2'], how='left')

Джон Эд
источник