2016-07-07 17 views
7

2つのデータフレームの同じ名前の列との違いをどのように選べばよいですか? 私はpd.merge(A, B, on=['X'])を実行すると、AとBの共通のX値を取得しますが、Xという名前の列とXという列のデータフレームBを持つデータフレームAを持っていますが、どうすれば "非共通"のものを取得できますか?あなたはhow='outer'indicator=Trueへのマージタイプを変更した場合パンダ(Python)の「アンチマージ」

+1

ちょうど 'A ['X']。isin(B ['X'])'を使ってAに固有の値を見て、逆にすることができます – EdChum

+0

また、私は 'pd.merge '_X'、indicator = True、how = 'outer')'これは '_merge' colを追加して動作します。これは' left_only'、 'right_only'という値を持ち、左/右のみ – EdChum

答えて

14

これは、両方の/右のみ/値が残っているかどうかを伝えるために列を追加します:

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 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 

またisinを使用していないBの値を見つけるために、マスクを否定することができます

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

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