panda: menggabungkan (bergabung) dua frame data pada banyak kolom

169

Saya mencoba menggabungkan dua bingkai data panda menggunakan dua kolom:

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

tetapi mendapat kesalahan berikut:

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

Adakah yang tahu cara yang tepat untuk melakukan ini? Terima kasih!

sejenis kacang-kacangan dari Jepang
sumber
53
left_ondan right_onharus berupa daftar string, bukan string yang terlihat seperti daftar.
root

Jawaban:

313

Coba ini

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: label atau daftar, atau nama bidang seperti array untuk bergabung di dalam DataFrame kiri. Dapat berupa vektor atau daftar vektor dengan panjang DataFrame untuk menggunakan vektor tertentu sebagai kunci gabungan, bukan kolom

right_on: label atau daftar, atau nama bidang seperti array untuk bergabung di dalam DataFrame kanan atau vektor / daftar vektor per dokumen left_on

Shijo
sumber
8
Jika left_ondan right_onsama adan b, bisakah kita menggunakan on = ['a', 'b']?
ahbon
4
Ya itu sangat valid.
user3065757
4

masalahnya di sini adalah bahwa dengan menggunakan tanda kutip Anda mengatur nilai yang diteruskan menjadi string, padahal, seperti yang dikatakan @Shijo dari dokumentasi, fungsi tersebut mengharapkan label atau daftar, tetapi bukan string! Jika daftar berisi masing-masing nama kolom yang dilewati untuk kerangka data kiri dan kanan, maka masing-masing nama kolom harus secara individual berada dalam apostrof. Dengan apa yang telah dinyatakan, kita dapat memahami mengapa ini tidak benar:

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

Dan ini adalah cara yang benar untuk menggunakan fungsi ini:

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

Cara lain untuk melakukan ini: new_df = A_df.merge(B_df, left_on=['A_c1','c2'], right_on = ['B_c1','c2'], how='left')

john ed
sumber