2016-07-01 25 views
0
Df1 

A B C 
1 1 'a' 
2 3 'b' 
3 4 'c' 

Df2 
    A B C 
    1 1 'k' 
    5 4 'e' 

Erwartete Ausgabe (nach Differenz und Zusammenführen von DF1 und Df2) dh Df1-Df2 und verschmelzen dannDifference zwei Datenrahmen basierend auf zwei Spalten Python Panda

output 

    A B C 
    1 1 'a' 
    2 3 'b' 
    3 4 'c' 
    5 4 'e' 

der Unterschied auf zwei Säulen gestützt werden soll A und B und nicht alle drei Spalten. Es ist mir egal, welche Spalte C in Df2 und Df1 enthält.

+1

Warum sollte der neue Datenrahmen '1,1 'haben, ein' 'und nicht' 1,1, "k" '? Gibt es ein Kriterium für die Spalte C? Soll Spalte C fallen gelassen werden? – Jeff

+0

Es ist wie gesetzt Unterschied. Linke Operandenwerte sollten da sein. –

+0

warum ist '5, 4, 'e'' da? – piRSquared

Antwort

0

Es ist eine äußere Verknüpfung, dann in Spalte C von DF2 verschmelzenden wenn ein Wert nicht in df1 bekannt ist:

dfx = df1.merge(df2, how='outer', on=['A', 'B']) 
dfx['C'] = dfx.apply(
    lambda r: r.C_x if not pd.isnull(r.C_x) else r.C_y, axis=1) 
dfx[['A', 'B', 'C']] 
=> 
    A B C 
0 1 1 a 
1 2 3 b 
2 3 4 c 
3 5 4 e 
3

versuchen Sie dies:

In [44]: df1.set_index(['A','B']).combine_first(df2.set_index(['A','B'])).reset_index() 
Out[44]: 
    A B C 
0 1 1 'a' 
1 2 3 'b' 
2 3 4 'c' 
3 5 4 'e' 
+0

Kudos für Sie herauszufinden, was der OP dachte. Aber ist das nicht mehr wie eine Addition? +1 – piRSquared

+0

@piRSquared, ja, ich denke du hast Recht. Aber mal sehen, ob es OK für OP ist oder nicht. – MaxU

0

Mit Concat und drop_duplicates:

output = pd.concat([df1, df2]) 
output = output.drop_duplicates(subset = ["A", "B"], keep = 'first') 

* Wunsch df: *

A B C 
0 1 1 a 
1 2 3 b 
2 3 4 c 
1 5 4 e 
Verwandte Themen