2016-07-07 8 views
7

Wie kann ich den Unterschied zwischen zwei Spalten mit demselben Namen in zwei Datenrahmen erkennen? Ich meine, ich habe Datenframe A mit einer Spalte namens X und Datenframe B mit Spalte namens X, wenn ich mache, bekomme ich die gemeinsamen X-Werte von A und B, aber wie kann ich die "nicht-gemeinsamen" erhalten ?"Anti-Merge" in Pandas (Python)

+1

Sie können einfach tun ~ ~ A ['X']. Isin (B ['X']) 'zu sehen, die Werte, die einzigartig sind für A und umgekehrt, um das Gegenteil zu tun – EdChum

+0

Auch ich denke, dass' pd.merge (A, B, on = ['X'], Indikator = True, wie = 'outer') 'wird funktionieren, da dies' _merge 'col hinzufügt und dies die Werte 'left_only',' right_only' hat, um anzuzeigen, ob die Werte sind nur links/rechts – EdChum

Antwort

14

Wenn Sie den Merge Typ how='outer' und indicator=True ändern wird dies eine Spalte hinzufügen, Ihnen zu sagen, ob die Werte sind links/beide/rechts nur:

In [2]: 
A = pd.DataFrame({'x':np.arange(5)}) 
B = pd.DataFrame({'x':np.arange(3,8)}) 
print(A) 
print(B) 
    x 
0 0 
1 1 
2 2 
3 3 
4 4 
    x 
0 3 
1 4 
2 5 
3 6 
4 7 

In [3]: 
pd.merge(A,B, how='outer', indicator=True) 

Out[3]: 
    x  _merge 
0 0.0 left_only 
1 1.0 left_only 
2 2.0 left_only 
3 3.0  both 
4 4.0  both 
5 5.0 right_only 
6 6.0 right_only 
7 7.0 right_only 

können Sie dann auswählen, die resultierende fusionierte df auf die _merge col:

In [4]: 
merged = pd.merge(A,B, how='outer', indicator=True) 
merged[merged['_merge'] == 'left_only'] 

Out[4]: 
    x  _merge 
0 0.0 left_only 
1 1.0 left_only 
2 2.0 left_only 

Sie auch isin und negieren die Maskenwerte verwenden können, finden nicht in B:

In [5]: 
A[~A['x'].isin(B['x'])] 

Out[5]: 
    x 
0 0 
1 1 
2 2