从pandas数据帧创建边列表

6
我想创建一个带权重属性的边缘列表(记录对出现的次数 - 例如,a-b这对在同一组中出现了多少个月)。
数据框包含特定团队每月成员的快照(每月团队中没有重复项)。
输出应该如下所示(不是有向的,所以a-b对与b-a对相同):
应用以下代码可以创建新的数据框来列出名字组合:
df1 = pd.DataFrame(data=list(combinations(df['name'].unique().tolist(), 2)), columns=['node1', 'node2'])

现在我不确定如何遍历这个新的数据框来填充权重。该如何做呢?


我不太清楚。权重是如何计算的?你能给我们展示一下吗? - Pavan Suvarna
只是澄清你的输出。是否也应该有一个节点对A-C呢?因为已经有A-D了。 - Raymond Toh
同一个月份内是否可以存在重复的值?例如,当monthyear=jun2020时,是否可以有两行都是a - Shaido
不要在月份分组中重复。 - h3rmit
是的,输出中应该有一个额外的a-c,我会添加它! - h3rmit
1个回答

3
假设在每个 `monthyear` 组中没有重复项,您可以获取每个组内所有名称的二元组合,然后按节点名称分组以获得权重。
from itertools import combinations

def get_combinations(group):
    return pd.DataFrame([sorted(e) for e in list(combinations(group['name'].values, 2))], columns=['node1', 'node2'])

df = df.groupby('monthyear').apply(get_combinations)

这将会给你一个中间结果:
            node1 node2
monthyear              
jul2020   0     a     b
          1     a     d
          2     b     d
jun2020   0     a     b
          1     a     c
          2     b     c

现在,计算重量:

df = df.groupby(['node1', 'node2']).size().to_frame('weight').reset_index()

最终结果:
  node1 node2  weight
0     a     b       2
1     a     c       1
2     a     d       1
3     b     c       1
4     b     d       1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接