Die aktuell ausgewählte Lösung führt zu falschen Ergebnissen. Um dieses Problem richtig zu lösen, können wir eine Linksverknüpfung von df1
bis durchführen df2
und sicherstellen, dass zuerst nur die eindeutigen Zeilen für abgerufen werden df2
.
Zuerst müssen wir den ursprünglichen DataFrame ändern, um die Zeile mit Daten hinzuzufügen [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
Führen Sie eine Linksverknüpfung durch, wobei Sie Duplikate entfernen, df2
sodass jede Verknüpfungsreihe df1
genau 1 Zeile enthält df2
. Verwenden Sie den Parameter indicator
, um eine zusätzliche Spalte zurückzugeben, die angibt, aus welcher Tabelle die Zeile stammt.
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
Erstellen Sie eine boolesche Bedingung:
df_all['_merge'] == 'left_only'
0 False
1 False
2 False
3 True
4 True
5 True
Name: _merge, dtype: bool
Warum andere Lösungen falsch sind
Einige Lösungen machen den gleichen Fehler - sie prüfen nur, ob jeder Wert in jeder Spalte unabhängig ist und nicht zusammen in derselben Zeile. Das Hinzufügen der letzten Zeile, die eindeutig ist, aber die Werte aus beiden Spalten enthält, df2
macht den Fehler sichtbar:
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
Diese Lösung führt zum gleichen falschen Ergebnis:
df1.isin(df2.to_dict('l')).all(1)