pandas: ผสาน (เข้าร่วม) สองเฟรมข้อมูลในหลายคอลัมน์


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 หรือ vector / รายการของ vector ต่อ left_on docs


8
ถ้าleft_onและright_onเหมือนกันaและbเราสามารถใช้on = ['a', 'b']?
ahbon

4
ใช่ว่าถูกต้องสมบูรณ์
user3065757

4

ปัญหาที่เกิดขึ้นคือการใช้เครื่องหมายอัญประกาศเดี่ยวคุณกำลังตั้งค่าที่ส่งผ่านเป็นสตริงเมื่อจริงตามที่ @Shijo ระบุไว้ในเอกสารแล้วฟังก์ชั่นนี้คาดว่าจะมีฉลากหรือรายการ แต่ไม่ใช่สตริง! หากรายการมีชื่อของสิ่งมีชีวิตแต่ละคอลัมน์ที่ส่งผ่านสำหรับทั้งด้านซ้ายและด้านขวาของ dataframe แต่ละชื่อคอลัมน์จะต้องอยู่ในเครื่องหมายวรรคตอน ด้วยสิ่งที่ระบุไว้เราสามารถเข้าใจได้ว่าทำไมสิ่งนี้ถึงไม่ถูกต้อง:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.