панди: об'єднати (об'єднати) два кадри даних у кількох стовпцях


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]'

Будь-яка ідея, що має бути правильним шляхом для цього? Дякую!


52
left_onі right_onповинен бути списком рядків, а не рядком, схожим на список.
корінь

Відповіді:


312

Спробуйте це

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


8
Якщо left_onі right_onоднакові, aі чи bможемо ми використовувати on = ['a', 'b']?
ахбон

4
Так, це цілком справедливо.
користувач3065757

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')

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.