首页 > 解决方案 > Pandas:比较数据框以获取更多和更改的行

问题描述

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

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     RELATIONSHIP_ID_1    RELATIONSHIP_ID_2
0          49                2          1 
1          52        Does not exist     3

标签: pythonpandascompare

解决方案


IIUC 对每个 dfs 使用groupbywithset然后我们进行比较

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

推荐阅读