从 pandas 数据帧创建边缘列表

h3r*_*mit 6 python networkx dataframe pandas

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

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

月年 姓名
2020年6月 A
2020年6月
2020年6月 C
2020年7月 A
2020年7月
2020年7月 d

输出应如下所示(它是无方向性的,因此 ab 对与 ba 相同):

节点1 节点2 重量
A 2
C 1
A C 1
A d 1
d 1

我设法使用以下命令创建一个具有名称组合的新数据框:

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

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

Sha*_*ica 3

假设每个组内没有重复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)
Run Code Online (Sandbox Code Playgroud)

这会给你一个中间结果:

            node1 node2
monthyear              
jul2020   0     a     b
          1     a     d
          2     b     d
jun2020   0     a     b
          1     a     c
          2     b     c
Run Code Online (Sandbox Code Playgroud)

现在,计算重量:

df = df.groupby(['node1', 'node2']).size().to_frame('weight').reset_index()
Run Code Online (Sandbox Code Playgroud)

最后结果:

  node1 node2  weight
0     a     b       2
1     a     c       1
2     a     d       1
3     b     c       1
4     b     d       1
Run Code Online (Sandbox Code Playgroud)