2017-05-15 37 views
1

我有以下兩個數據幀:df1和df2。 對於每個用戶,我想刪除包含未出現在df2中的itemid的行。熊貓 - 給定兩個數據幀,刪除差異

df1 

userid itemid 
    1  1 
    1  3 
    1  4 
    2  1 
    2  2 
    2  3 
    2  4 


df2 

userid itemid 
    1  1 
    1  2 
    1  3 
    1  4 
    2  1 
    2  2 
    2  3 

由於用戶ID = 1在DF1已itemids在DF2 1,3,4和用戶ID = 1具有itemids 1,2,3,4,我不必從DF1除去任何行。但是,對於userid = 2,df1具有項目ID 2,3,4,而df2具有項目ID 1,2,3。在這種情況下,我想刪除最後一行,因爲itemid = 4不在df2中。 因此,答案應該是以下幾點:

new_df1 

userid itemid 
    1  1 
    1  3 
    1  4 
    2  1 
    2  2 
    2  3 

請注意,DF2不應該改變。我只想要df1改變。

回答

2

使用mergeleft joinindicator其中是行的起源。

然後通過query過濾和通過drop除去輔助柱:

print (pd.merge(df1, df2, how='left', indicator=True)) 
    userid itemid  _merge 
0  1  1  both 
1  1  3  both 
2  1  4  both 
3  2  1  both 
4  2  2  both 
5  2  3  both 
6  2  4 left_only 

df = pd.merge(df1, df2, how='left', indicator=True) 
     .query("_merge != 'left_only'") 
     .drop('_merge',axis=1) 
print (df) 
    userid itemid 
0  1  1 
1  1  3 
2  1  4 
3  2  1 
4  2  2 
5  2  3 

替代溶液與boolean indexing

df = pd.merge(df1, df2, how='left', indicator=True) 
df = df[df['_merge'] != 'left_only'].drop('_merge',axis=1) 
print (df) 
    userid itemid 
0  1  1 
1  1  3 
2  1  4 
3  2  1 
4  2  2 
5  2  3