2016-07-07 70 views
7

如何在兩個數據框中挑出與同名列的區別? 我的意思是我有一個數據框A的列名爲X和數據框B的列名爲X,如果我做pd.merge(A, B, on=['X']),我會得到A和B的共同的X值,但我怎麼能得到「非常見」的?熊貓(Python)中的「反合併」

+1

你可以用'〜A ['X']。isin(B ['X'])'來查看A唯一的值,並且做相反的操作 – EdChum

+0

另外我認爲'pd.merge (A,B,on = ['X'],indicator = True,how ='outer')'將會起作用,因爲這會增加_merge col,並且這將具有值'left_only','right_only'以指示值只有左/右 – EdChum

回答

14

如果更改合併類型爲how='outer'indicator=True這將增加一列告訴你值是否是左/都/右只:

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 

然後,您可以篩選產生的合併對DF _merge西:

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 

您還可以使用isin和否定面具B中找到值不:

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

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