La solution actuellement sélectionnée produit des résultats incorrects. Pour résoudre correctement ce problème, nous pouvons effectuer une jointure gauche de df1
à df2
, en nous assurant d'obtenir d'abord uniquement les lignes uniques pour df2
.
Tout d'abord, nous devons modifier le DataFrame d'origine pour ajouter la ligne avec les données [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
Effectuez une jointure gauche, en éliminant les doublons df2
afin que chaque ligne de df1
jointures avec exactement 1 ligne de df2
. Utilisez le paramètre indicator
pour renvoyer une colonne supplémentaire indiquant de quelle table provient la ligne.
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
Créez une condition booléenne:
df_all['_merge'] == 'left_only'
0 False
1 False
2 False
3 True
4 True
5 True
Name: _merge, dtype: bool
Pourquoi les autres solutions sont mauvaises
Quelques solutions font la même erreur - elles vérifient seulement que chaque valeur est indépendamment dans chaque colonne, pas ensemble dans la même ligne. L'ajout de la dernière ligne, qui est unique mais contient les valeurs des deux colonnes de, df2
expose l'erreur:
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
Cette solution obtient le même mauvais résultat:
df1.isin(df2.to_dict('l')).all(1)