ปัญหาการเข้าร่วมของ Pandas: คอลัมน์ทับซ้อนกัน แต่ไม่ได้ระบุคำต่อท้าย


136

ฉันมีกรอบข้อมูล 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 dataframes เหล่านี้:

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

ฉันได้รับข้อผิดพลาด:

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

ทำไมจึงเป็นเช่นนั้น? ดาต้าเฟรมมีค่า 'mukey' ทั่วไป

คำตอบ:


146

ข้อผิดพลาดของคุณเกี่ยวกับตัวอย่างข้อมูลที่คุณโพสต์เป็นความลับเล็กน้อยเนื่องจากไม่มีค่าทั่วไปการดำเนินการรวมจึงล้มเหลวเนื่องจากค่าไม่ทับซ้อนกันทำให้คุณต้องระบุส่วนต่อท้ายสำหรับด้านซ้ายและขวา:

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

การเข้าร่วมส่วนใหญ่จะใช้เพื่อเข้าร่วมตามดัชนีเท่านั้นไม่ใช่ในชื่อแอตทริบิวต์ดังนั้นให้เปลี่ยนชื่อแอตทริบิวต์ในดาต้าเฟรมสองแบบที่แตกต่างกันจากนั้นลองเข้าร่วมพวกเขาจะเข้าร่วมมิฉะนั้นข้อผิดพลาดนี้จะเพิ่มขึ้น

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