2016-12-02 6 views
0

Ich versuche einen Weg zu finden, um das Folgende zu erreichen: df1 und df2 sind 2 Beispieldatenrahmen zwischen denen ich den Unterschied finden musste. Sie haben die gleichen Spalten, aber Zeilendaten können sich ändern, wenn neue Namen hinzugefügt, alte entfernt oder Daten des vorhandenen Satzes geändert werden.Pandas: Wechsel zwischen zwei Datenrahmen

df1:

Col1 Col2 Col3 Col4 Col5 
0  1 ABC 94 xxx apple 
1  1 DEF 24 xxx apple 
2  2 ABC 40 yyy banana 
3  3 ABC 74 zzz pear 
4  3 DEF 43 zzz pear 

df2:

Col1 Col2 Col3 Col4  Col5 
0  1 ABC 71 xxx  apple 
1  2 PQR 65 yyy  banana 
2  3 ABC 86 zzz  pear 
3  3 DEF 53 zzz  pear 
4  4 PQR 26 mmm pineapple 

Ausgang:

Col1 Col2 Col3 Col4  Col5 
0  1 ABC -23 xxx  apple 
1  1 DEF -24 xxx  apple 
2  2 ABC -40 yyy  banana 
3  2 PQR 65 yyy  banana 
4  3 ABC 12 zzz  pear 
5  3 DEF 10 zzz  pear 
6  4 PQR 26 mmm pineapple 

Ich habe versucht, this und die Stackoverflow-Links, die sie erwähnt, aber ich brauche die Änderung nur auf nur für bestimmte Spalten anwendbar sein und neue Zeilen mit einem neuen Schlüssel (in meinem Beispiel Col1) anfügen zusammen

Danke vm für einen Blick!

+0

versuchen So ist Ihr gewünschtes Ergebnis die Ausgabe: Block? –

+0

In der Tat .. das ist ein Beispiel, das ich erstellt habe, das ich denke, Adressen alle Aspekte meines Problems – spiff

Antwort

2

Wie pro meinem Verständnis Sie DF2-DF1 auf Col3 tun, können Sie

df2.set_index(['Col1', 'Col2', 'Col4', 'Col5']).sub(df1.set_index(['Col1', 'Col2', 'Col4', 'Col5']), fill_value=0).reset_index() 
+0

Prost Mann! war so einfach, muss set_index() besser verstehen .. danke – spiff

+0

Froh, dass es geholfen hat .. –

2

Wenn die Kennungen sind Spalten C1, C2, C4 und C5, können Sie diese als Index gesetzt und verwenden .sub:

idx = ['Col1', 'Col2', 'Col4', 'Col5'] 

df2.set_index(idx).sub(df1.set_index(idx), fill_value=0) 
Out[16]: 
          Col3 
Col1 Col2 Col4 Col5   
1 ABC xxx apple  -23.0 
    DEF xxx apple  -24.0 
2 ABC yyy banana -40.0 
    PQR yyy banana  65.0 
3 ABC zzz pear  12.0 
    DEF zzz pear  10.0 
4 PQR mmm pineapple 26.0 

Sie reset_index am Ende nennen kann, auch:

df2.set_index(idx).sub(df1.set_index(idx), fill_value=0).reset_index() 
Out[17]: 
    Col1 Col2 Col4  Col5 Col3 
0  1 ABC xxx  apple -23.0 
1  1 DEF xxx  apple -24.0 
2  2 ABC yyy  banana -40.0 
3  2 PQR yyy  banana 65.0 
4  3 ABC zzz  pear 12.0 
5  3 DEF zzz  pear 10.0 
6  4 PQR mmm pineapple 26.0 
+0

danke vm .. denken @aakash_makwana macht das gleiche in einer Zeile? also haben akzeptiert, dass – spiff

+0

Sicher, eine Zeile ist auch möglich. Ich dachte, das ist lesbarer. Bitte schön. :) – ayhan

+0

Sie sind in der Tat richtig, das ist besser lesbar – spiff

Verwandte Themen