2016-11-23 4 views
1

私は複数の列を持つデータフレームdf1を持っています。私は同じ列のセットでdf2を持っています。私はdf2に存在しないdf1のレコードを取得したいと思います。パンダの列のペアに基づいて照合

df1[~df1['ID'].isin(df2['ID'])] 

ここでは同じ操作をしたいが、NAMEとIDの組み合わせにしたい。つまり、名前とIDがdf1のペアとして一緒にdf2に同じペアとして存在する場合、そのレコード全体が私の結果に含まれてはいけません。

パンダを使用してこのタスクを達成するにはどうすればよいですか?

+0

は 'NAME'を連結して新しい列を作成し、あなたの質問に 'ID'を使用したのと同じ方法で、この新しい列を使用してください。 – burhan

答えて

0

それは実際にはかなり簡単です。

df1[(~df1[['ID', 'Name']].isin(df2[['ID', 'Name']])).any(axis=1)] 

比較する列名をリストとして渡します。興味深い部分は、それが出力するものです。

のはdf1に等しいとしましょう:

ID Name 
0 0  0 
1 1  1 
2 2  2 
3 3  3 
4 4  4 
5 5  5 
6 6  6 
7 7  7 
8 8  8 
9 1  1 

そしてdf2に等しい:行のための除くdf1df2マッチ

ID Name 
0 0  0 
1 1  1 
2 2  2 
3 3  3 
4 4  4 
5 5  5 
6 6  6 
7 7  7 
8 8  8 
9 1  9 

すべて(ID, Name)ペア私の答えの結果9.返します。

ID Name 
9 1  1 

これはまさにあなたが望むものです。より詳細には

、あなたがマスクを行うとき:

~df[['ID', 'Name']].isin(df2[['ID', 'Name']] 

をあなたはこの取得:

 ID Name 
0 False False 
1 False False 
2 False False 
3 False False 
4 False False 
5 False False 
6 False False 
7 False False 
8 False False 
9 False True 

をそして、我々は、これらの列のいずれかに該当する行を選択します。このために、我々は、作成最後にany(axis=1)を追加することができます。

0 False 
1 False 
2 False 
3 False 
4 False 
5 False 
6 False 
7 False 
8 False 
9  True 

をそしてこのシリーズを使用するときに、インデックス、その後、それが唯一の選択行9

0

あなたは、あなたの質問にIDを使用したのと同じ方法で名前とIDを連結して新しい列を作成し、この新しい列を使用することができます。

df1['temp'] = df1['NAME'].astype(str)+df1['ID'].astype(str) 
df2['temp'] = df2['NAME'].astype(str)+df2['ID'].astype(str) 
df1[~df1['temp'].isin(df2['temp'])].drop('temp',1) 
関連する問題