2017-09-01 3 views
0

Ich habe die folgenden zwei Datenrahmen:Python: Vergleichen Datenrahmen basiert auf zwei Bedingungen

df1:

date id 
2000 1 
2001 1 
2002 2 

df2:

date id 
2000 1 
2002 2 

ich nun eine Liste der Beobachtungen extrahieren möchten, dass sind in df1, aber nicht in df2 basierend auf Datum und ID.

Das Ergebnis sollte wie folgt aussehen:

date id 
2001 1 

Ich weiß, wie ein Befehl macht eine Spalte zu einer Liste mit isin wie diese zu vergleichen:

result = df1[~df1["id"].isin(df2["id"].tolist())] 

Dies würde jedoch die einzigen vergleichen zwei Datenrahmen basierend auf der Spalten-ID. Weil es sein könnte, dass die ID in df1 und df2 ist, aber für verschiedene Daten ist es wichtig, dass ich nur Werte bekomme, bei denen beide - id und date - in den zwei Datenrahmen vorhanden sind. Weiß jemand, wie man das macht?

Antwort

1

Mit merge

In [795]: (df1.merge(df2, how='left', indicator='_a') 
       .query('_a == "left_only"') 
       .drop('_a', 1)) 
Out[795]: 
    date id 
1 2001 1 

Einzelheiten

In [796]: df1.merge(df2, how='left', indicator='_a') 
Out[796]: 
    date id   _a 
0 2000 1  both 
1 2001 1 left_only 
2 2002 2  both 

In [797]: df1.merge(df2, how='left', indicator='_a').query('_a == "left_only"') 
Out[797]: 
    date id   _a 
1 2001 1 left_only 
Verwandte Themen