2017-05-15 64 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