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)
现在我不确定如何迭代这个新数据框来填充权重。如何才能做到这一点?
假设每个组内没有重复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)