我有一個數據幀df1與多列。我有同一組列的df2。我想獲得df1中不存在的df1記錄。我能執行此任務如下:基於熊貓中的一對列進行匹配
df1[~df1['ID'].isin(df2['ID'])]
現在我想同樣的操作,但在名稱和ID的組合。這意味着,如果來自df1的作爲一對的名稱和ID在df2中同時存在,那麼整個記錄不應該是我結果的一部分。
如何使用熊貓來完成此任務?
我有一個數據幀df1與多列。我有同一組列的df2。我想獲得df1中不存在的df1記錄。我能執行此任務如下:基於熊貓中的一對列進行匹配
df1[~df1['ID'].isin(df2['ID'])]
現在我想同樣的操作,但在名稱和ID的組合。這意味着,如果來自df1的作爲一對的名稱和ID在df2中同時存在,那麼整個記錄不應該是我結果的一部分。
如何使用熊貓來完成此任務?
這其實很容易。
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
df1
和df2
比賽之間的每一個(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
您可以通過連接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)
通過串聯'NAME'創建一個新的列和'ID'並使用這個新的列,就像你在問題中使用'ID'一樣。 – burhan