Ich muss zwei Datenframes unterschiedlicher Größe zeilenweise vergleichen und nicht passende Zeilen ausdrucken. Nehmen wir die folgenden zwei:
df1 = DataFrame({
'Buyer': ['Carl', 'Carl', 'Carl'],
'Quantity': [18, 3, 5, ]})
df2 = DataFrame({
'Buyer': ['Carl', 'Mark', 'Carl', 'Carl'],
'Quantity': [2, 1, 18, 5]})
Was ist der effizienteste Weg, Zeilen über df2 Zeilen und nicht in df1 auszudrucken, z.
Buyer Quantity
Carl 2
Mark 1
Wichtig: Ich möchte keine Reihe haben:
Buyer Quantity
Carl 3
im diff enthalten:
Ich habe es bereits versucht: Vergleichen von zwei Datenframes unterschiedlicher Länge Zeile für Zeile und Hinzufügen von Spalten für jede Zeile mit gleichem Wert Und Ausgabe der Differenz in zwei Pandas-Datenframes nebeneinander - Hervorhebung der Differenz
Diese passen jedoch nicht zu meinem Problem.
Vielen Dank
Andy
merge
die 2 dfs mit der Methode 'outer' und pass param indicator=True
geben an, ob die Zeilen nur in/nur links/rechts vorhanden sind. Sie können die zusammengefügte df dann filtern:
In [22]:
merged = df1.merge(df2, indicator=True, how='outer')
merged[merged['_merge'] == 'right_only']
Out[22]:
Buyer Quantity _merge
3 Carl 2 right_only
4 Mark 1 right_only
diff = set(Zip(df2.Buyer, df2.Quantity)) - set(Zip(df1.Buyer, df1.Quantity))
Dies ist die erste Lösung, die mir einfiel. Sie können den Diff-Satz dann wieder in einem DF zur Präsentation ablegen.
sie können dies als die besten finden:
df2[ ~df2.isin(df1)].dropna()
@ EdChums Antwort ist selbsterklärend. Aber mit not 'both'
Bedingung macht mehr Sinn und Sie müssen sich nicht um die Reihenfolge des Vergleichs kümmern, und das ist, was ein reales diff sein soll. Um Ihre Frage zu beantworten:
merged = df1.merge(df2, indicator=True, how='outer')
merged.loc = [merged['_merge'] != 'both']
Versuchen Sie Folgendes, wenn Sie nur die neuen Käufer zum anderen df hinzufügen möchten:
df_delta=df2[df2['Buyer'].apply(lambda x: x not in df1['Buyer'].values)]