2016-07-07 66 views
7

İki adede aynı addaki sütunlar arasındaki farkı nasıl seçebilirim? Yani, X adında bir sütun ve X adında bir sütun içeren veri çerçevesi A, pd.merge(A, B, on=['X']) yaparsam, A ve B'nin ortak X değerlerini alacağım, ancak "ortak olmayan" olanları nasıl alabilirim? ? Eğer how='outer' ve indicator=True için birleştirme türünü değiştirirseniz"Anti-birleştirme" pandalarda (Python)

+1

Sadece A ['X']. Isin (B ['X']) 'A'ya özgü değerleri görmek ve tersini yapmak için tersine çevirebilirsiniz – EdChum

+0

Ayrıca bd.merge (A, B, on = ['X'], indikatör = Doğru, nasıl = 'dış') 'bu '_merge' col ekler ve bu değerlerin" left_only "," right_only "değerlerine sahip olup olmadığını belirtecek şekilde çalışacaktır. sadece sol/sağ – EdChum

cevap

14

bu ikisi/sağ yalnızca/değerler sola olup olmadığını söylemek için bir sütun katacak:

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 

Daha sonra ortaya çıkan üzerinde df birleşti filtre edebilirsiniz _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 
Ayrıca B değerleri değil bulmak için maske isin kullanabilir ve ortadan kaldıran

:

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

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