โซลูชันที่เลือกไว้ในปัจจุบันให้ผลลัพธ์ที่ไม่ถูกต้อง เพื่อแก้ปัญหานี้อย่างถูกต้องเราสามารถทำการรวมซ้ายdf1
ไปถึงdf2
ตรวจสอบให้แน่ใจว่าได้รับแถวที่ไม่ซ้ำกันก่อนdf2
ก่อน
ก่อนอื่นเราต้องแก้ไข DataFrame ดั้งเดิมเพื่อเพิ่มแถวด้วย data [3, 10]
df1 = pd.DataFrame(data = {'col1' : [1, 2, 3, 4, 5, 3],
'col2' : [10, 11, 12, 13, 14, 10]})
df2 = pd.DataFrame(data = {'col1' : [1, 2, 3],
'col2' : [10, 11, 12]})
df1
col1 col2
0 1 10
1 2 11
2 3 12
3 4 13
4 5 14
5 3 10
df2
col1 col2
0 1 10
1 2 11
2 3 12
ทำการซ้ายเข้าร่วมการขจัดซ้ำกันในdf2
เพื่อให้แถวของแต่ละdf1
ร่วมกับว่า 1 df2
แถว ใช้พารามิเตอร์indicator
เพื่อส่งกลับคอลัมน์พิเศษที่ระบุว่าแถวมาจากไหน
df_all = df1.merge(df2.drop_duplicates(), on=['col1','col2'],
how='left', indicator=True)
df_all
col1 col2 _merge
0 1 10 both
1 2 11 both
2 3 12 both
3 4 13 left_only
4 5 14 left_only
5 3 10 left_only
สร้างเงื่อนไขบูลีน:
df_all['_merge'] == 'left_only'
0 False
1 False
2 False
3 True
4 True
5 True
Name: _merge, dtype: bool
เหตุใดโซลูชันอื่น ๆ จึงผิด
วิธีแก้ปัญหาสองสามข้อนั้นทำผิดพลาดเหมือนกัน - พวกเขาตรวจสอบเฉพาะว่าแต่ละค่านั้นมีความเป็นอิสระในแต่ละคอลัมน์ไม่รวมกันในแถวเดียวกัน การเพิ่มแถวสุดท้ายซึ่งไม่ซ้ำกัน แต่มีค่าจากทั้งสองคอลัมน์จากการdf2
เปิดเผยข้อผิดพลาด:
common = df1.merge(df2,on=['col1','col2'])
(~df1.col1.isin(common.col1))&(~df1.col2.isin(common.col2))
0 False
1 False
2 False
3 True
4 True
5 False
dtype: bool
วิธีนี้ได้รับผลลัพธ์ที่ผิดเหมือนกัน:
df1.isin(df2.to_dict('l')).all(1)