Solusi yang dipilih saat ini menghasilkan hasil yang salah. Untuk mengatasi masalah ini dengan benar, kita dapat melakukan join-kiri dari df1
hingga df2
, memastikan untuk mendapatkan terlebih dahulu baris unik untukdf2
.
Pertama, kita perlu memodifikasi DataFrame asli untuk menambahkan baris dengan 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
Lakukan join-kiri, hilangkan duplikat df2
sehingga setiap baris df1
bergabung dengan tepat 1 baris df2
. Gunakan parameter indicator
untuk mengembalikan kolom tambahan yang menunjukkan dari tabel mana baris itu berasal.
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
Buat kondisi boolean:
df_all['_merge'] == 'left_only'
0 False
1 False
2 False
3 True
4 True
5 True
Name: _merge, dtype: bool
Mengapa solusi lain salah
Beberapa solusi membuat kesalahan yang sama - mereka hanya memeriksa bahwa setiap nilai secara independen di setiap kolom, tidak bersama di baris yang sama. Menambahkan baris terakhir, yang unik tetapi memiliki nilai dari kedua kolom dari df2
memperlihatkan kesalahan:
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
Solusi ini mendapatkan hasil yang salah yang sama:
df1.isin(df2.to_dict('l')).all(1)