webentwicklung-frage-antwort-db.com.de

Pandas: Diff von zwei Datenframes

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

27
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
70
EdChum
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.

6
Shovalt

sie können dies als die besten finden:

df2[ ~df2.isin(df1)].dropna()
4
A. Nadjar

@ 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']
0
Shayan Amani

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)]
0
Yasir