2017-05-15 1 views
1

나는 다음과 같은 두 개의 데이터 프레임 : df1과 df2 있습니다. 각 사용자마다 df2에 표시되지 않는 itemids가 포함 된 행을 제거하고 싶습니다. DF2에서 1,3,4 및 사용자 ID = 1 itemids에게 1,2,3,4 itemids있다 DF1의 사용자 ID 이후팬더 - 주어진 두 데이터 프레임, 차이를 제거

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 

= 1이있다, 나는 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