2016-11-23 58 views
1

我有一個數據幀df1與多列。我有同一組列的df2。我想獲得df1中不存在的df1記錄。我能執行此任務如下:基於熊貓中的一對列進行匹配

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

現在我想同樣的操作,但在名稱和ID的組合。這意味着,如果來自df1的作爲一對的名稱和ID在df2中同時存在,那麼整個記錄不應該是我結果的一部分。

如何使用熊貓來完成此任務?

+0

通過串聯'NAME'創建一個新的列和'ID'並使用這個新的列,就像你在問題中使用'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等於:

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 

df1df2比賽之間的每一個(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

您可以通過連接NAME和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)