首页 > 解决方案 > 计算一个熊猫数据框中的一对值出现在另一个数据框中的次数

问题描述

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

在一个新的数据框中,我想计算列node1node2in 中每行的值对df1出现在 和 中的行中sourcetarget频率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

标签: pythonpandasdataframe

解决方案


由于您不关心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()
)

推荐阅读