python - 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 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
解决方案
IIUC 对每个 dfs 使用groupby
withset
然后我们进行比较
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
推荐阅读
- java - 从 IntelliJ 生成 .JAR
- angular - 审查模板中符号的角度选项
- common-lisp - LISP 使列表项为正
- javascript - 试图让用户输入在 P 元素中打印
- c# - 重定向不包括应用程序名称,并且身份验证无法正常工作
- bash - 如何在 kubectl set image 中提供名称
- javascript - Angular 动态本地化和 facebook.sdk 不会更新 Like 按钮的翻译
- c++ - 没有指针时如何修复“分段错误”?
- react-native - React Native setTimeout - 如何清除超时
- java - 如何使用具有自定义名称的 Apache Commons IO 在 java 中复制文件?