从 pandas 数据框创建边列表

Creating an edge list from a pandas dataframe

我想创建一个以权重作为属性的边列表(计算对出现的次数 - 例如,对 a-b 在同一组中在一起有多少个月)。

数据框包含特定团队中人员的每月快照(每月组中没有重复项)

monthyear name
jun2020 a
jun2020 b
jun2020 c
jul2020 a
jul2020 b
jul2020 d

输出应如下所示(它是非定向的,因此 a-b 对与 b-a 相同):

node1 node2 weight
a b 2
b c 1
a c 1
a d 1
b d 1

我设法使用以下名称组合创建了一个新数据框:

df1 = pd.DataFrame(data=list(combinations(df['name'].unique().tolist(), 2)), columns=['node1', 'node2'])

现在我不确定如何迭代这个新数据框来填充权重。如何做到这一点?

假设每个monthyear组内没有重复,则可以得到每个组内所有2个名字的组合,然后按节点名分组得到权重。

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