2016-10-27 4 views
1

Ich habe folgende 2 Datenrahmen:Vergleichen zwei Gruppenergebnisse

DF1: 
    DATE   ID_1 ID_2 RESULT 
0 2014-06-16  1 a RED 
1 2014-07-01  1 a WHITE 
2 2014-08-16  2 c BLUE 
3 2015-08-16  3 a RED 


DF2 
    DATE   ID_1 ID_2 RESULT 
0 2014-06-16  1 z WHITE 
1 2014-07-01  1 z WHITE 
2 2014-08-16  2 h BLUE 
3 2014-08-16  3 k RED 

Dass Sie, indem Sie diese erhalten können:

df1 = pd.DataFrame(columns=["DATE","ID_1", "ID_2", "RESULT" ]) 
df2 = pd.DataFrame(columns=["DATE","ID_1", "ID_2","RESULT"]) 

df1["DATE"] = ['2014-06-16', '2014-07-01', '2014-08-16', '2015-08-16'] 
df1['ID_1'] = [1,1,2,3] 
df1['ID_2'] = ['a', 'a', 'c', 'a'] 
df1['RESULT'] = ['RED', 'WHITE', 'BLUE', 'RED'] 

df2["DATE"] = ['2014-06-16', '2014-07-01', '2014-08-16' , '2014-08-16'] 
df2['ID_1'] = [1,1,2,3] 
df2['ID_2'] = ['z', 'z', 'h', 'k'] 
df2['RESULT'] = ['WHITE', 'WHITE', 'BLUE', 'RED'] 

Jetzt brauche ich „ID_1“ auf beide und vergleichen, wenn alle GROUPBY Spalten (außer ID_2) sind gleich. Im Idealfall durch die Unterschiede zeigt

Das Ergebnis sollte so sein:

DATE   ID_1 ID_2x ID2y RESULTx RESULTy 
2014-06-16  1 z  a  WHITE RED 

ich durch die Gruppierung wie folgt versucht:

grp1 = df1.groupby("ID_1") 
grp2 = df2.groupby("ID_1") 

for (g1,g2) in zip(grp1,grp2): 
     g1[1][["DATE", "RESULT"]] != g2[1][["DATE", "RESULT"]] 

Aber ich glaube nicht effizient ist. Außerdem erhalte ich einen Vergleichsfehler:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all() 

Irgendeine Idee darüber, wie man vorgeht?

Danke!

+0

'df1' und' df2' haben keine 'ID_2'-Werte gemeinsam. Wenn sie nicht genau die gleiche Liste eindeutiger 'ID_2'-Werte haben, ist das Iterieren durch Zippen der Gruppen eine schlechte Idee. Und selbst dann wird der Vergleich der Gruppen schwierig, da sie wahrscheinlich unterschiedlich lang sind. – IanS

+0

Wenn Sie sagen "Das Ergebnis sollte wie sein" meinen Sie, dass der folgende Code eine Zeile des beabsichtigten Ergebnisses oder das gesamte beabsichtigte Ergebnis zeigt? Es ist nicht genau klar, was das Ergebnis des Vergleichs sein soll. Unter welchen Bedingungen sollte eine bestimmte Zeile in der Ausgabe enthalten sein? – ASGM

+0

Sie haben recht, es ist ein Tippfehler, nur behoben. Ich meine Gruppierung nach ID_1. – user2320577

Antwort

1

Das Problem erneut angeben: Sie möchten zwei Datenrahmen vergleichen und alle Zeilen finden, deren Werte sich unterscheiden (mit Ausnahme einer bestimmten Spalte). Hier ist eine Möglichkeit, es zu tun:

cols = ['DATE', 'ID_1', 'RESULT'] 
cond = (df1[cols] != df2[cols]).any(axis=1) 
new_df = df1[cond].merge(df2[cond], on='ID_1', how='outer', suffixes=('x','y')) 

(Das Ergebnis unterscheidet sich ein wenig von dem in Ihrer Antwort, weil ich nicht ganz sicher über das allgemeine Verhalten war für Sie suchen - meine Kommentare auf der Antwort sehen) .