python - 计算一个熊猫数据框中的一对值出现在另一个数据框中的次数
问题描述
df1
我有一个看起来像这样的熊猫数据框:
import pandas as pd
d = {'node1': [47, 24, 19, 77, 24, 19, 77, 24, 56, 92, 32, 77], 'node2': [24, 19, 77, 24, 19, 77, 24, 19, 92, 32, 77, 24], 'user': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C']}
df1 = pd.DataFrame(data=d)
df1
node1 node2 user
47 24 A
24 19 A
19 77 A
77 24 A
24 19 A
19 77 B
77 24 B
24 19 B
56 92 C
92 32 C
32 77 C
77 24 C
第二个 pandas 数据框df2
如下所示:
d2 = {'way_id': [4, 3, 1, 8, 5, 2, 7, 9, 6, 10], 'source': [24, 19, 84, 47, 19, 16, 77, 56, 32, 92], 'target': [19, 43, 67, 24, 77, 29, 24, 92, 77, 32]}
df2 = pd.DataFrame(data=d2)
df2
way_id source target
4 24 19
3 19 43
1 84 67
8 47 24
5 19 77
2 16 29
7 77 24
9 56 92
6 32 77
10 92 32
在一个新的数据框中,我想计算列node1
和node2
in 中每行的值对df1
出现在 和 中的行中source
的target
频率df2
。顺序是相关的,但也应将相应的用户添加到新列中。这就是为什么所需的输出应该是这样的:
way_id source target count user
4 24 19 2 A
3 19 43 0 A
1 84 67 0 A
8 47 24 1 A
5 19 77 1 A
2 16 29 0 A
7 77 24 1 A
9 56 92 0 A
6 32 77 0 A
10 92 32 0 A
4 24 19 1 B
3 19 43 0 B
1 84 67 0 B
8 47 24 0 B
5 19 77 1 B
2 16 29 0 B
7 77 24 1 B
9 56 92 0 B
6 32 77 0 B
10 92 32 0 B
4 24 19 0 C
3 19 43 0 C
1 84 67 0 C
8 47 24 0 C
5 19 77 0 C
2 16 29 0 C
7 77 24 1 C
9 56 92 1 C
6 32 77 1 C
10 92 32 1 C
解决方案
由于您不关心source/target
匹配,因此您需要复制数据merge
:
(pd.concat([df1.rename(columns={'node1':'source','node2':'target'}),
df1.rename(columns={'node2':'source','node1':'target'})]
)
.merge(df2, on=['source','target'], how='outer')
.groupby(['source','target','user'], as_index=False)['way_id'].count()
)
推荐阅读
- java - 如何在 Agora android 中添加文字水印?
- docker - docker build 不会复制 css 文件
- angular - 如何从 Angular 10 中的“@angular-redux/store”中进行单元测试选择?
- asp.net-core-mvc - 映射两个相同的模型,使用自动映射器嵌套
- java - 简单的构造函数练习 Java
- database - Gremlin 查询:到目前为止,如何在查询中获取所有“内部”边缘?
- python - 如何将此代码更改为不打印未使用的硬币=0?
- c# - 改变一个组合框的值会导致另一个组合框的值改变
- amazon-web-services - 通过 SQL 规则查询语句进行规则,如果温度高于所有其他设备的平均值 15% 以上,则可以采取措施
- automapper - Automapper 初始化配置不返回 - 可能的无限循环