熊猫:比较数据框是否有其他行和更改过的行

时间:2018-10-17 17:57:44

标签: python pandas compare

这可能是一个非常愚蠢的问题,但是我有两个这样的熊猫数据框

df1

         USR_ID  RELATIONSHIP_ID    
0           49                2    
1           50               58    
2           52                2    
3           52               58    

df2

         USR_ID  RELATIONSHIP_ID    
0           49                1     
1           50               58     
2           52                3     
3           52               58
4           52                2

df2可以有额外的行,但是可以保证df1和df2都具有相同且确切的USR_ID。我希望跟踪df1和df2之间的变化。在这种情况下-

  • USR_ID 49具有不同的关系(2和1)
  • USR_ID 52具有附加关系3

所以我想返回的是一个具有以下内容的数据框:

       USR_ID     RELATIONSHIP_ID_1    RELATIONSHIP_ID_2
0          49                2          1 
1          52        Does not exist     3

1 个答案:

答案 0 :(得分:1)

IIUC对每个df使用groupbyset,然后进行比较

s1=df1.groupby('USR_ID')['RELATIONSHIP_ID'].apply(set)
s2=df2.groupby('USR_ID')['RELATIONSHIP_ID'].apply(set)
[(x-y)|(y-x) for x , y in zip(*pd.concat([s1,s2],1).values.T)]

Out[585]: [{1, 2}, set(), {3}]

更新

i1=[(x-y) for x , y in zip(*pd.concat([s1,s2],1).values.T)]
i2=[(y-x) for x , y in zip(*pd.concat([s1,s2],1).values.T)]
pd.DataFrame({'RELATIONSHIP_ID_1':list(map(list,i1)),'RELATIONSHIP_ID_2':list(map(list,i2))},index=s1.index).apply(lambda x : x.str[0]).dropna(thresh=1)
Out[646]: 
        RELATIONSHIP_ID_1  RELATIONSHIP_ID_2
USR_ID                                      
49                    2.0                1.0
52                    NaN                3.0