2017-05-15 12 views
1

私は以下の2つのデータフレームdf1とdf2を持っています。 各ユーザーについて、df2に表示されないitemidを含む行を削除したいとします。pandas - 2つのデータフレームが与えられた場合、差分を取り除く

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は= DF1における1は、アイテムID DF2で1,3,4およびユーザーID = 1がアイテムID 1,2,3,4を持っているので、私はDF1から任意の行を削除する必要はありません。しかし、userid = 2の場合、df1はitemids 2,3,4を持ち、df2はitemids 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 
関連する問題