我想创建一个以权重作为属性的边列表(计算对出现的次数 - 例如,一对 a-b 在同一组中在一起的月份数)。
数据框包含特定团队中人员的月度快照(月度组没有重复)
月年
姓名
2020 年 6 月
一种
2020 年 6 月
乙
2020 年 6 月
C
2020 年 7 月
一种
2020 年 7 月
乙
2020 年 7 月
d
输出应如下所示(它是非定向的,因此 a-b 对与 b-a 相同):
节点 1
节点2
重量
一种
乙
2
乙
C
1
一种
C
1
一种
d
1
乙
d
1
我设法使用以下名称组合创建了一个新的数据框:
df1 = pd.DataFrame(data=list(combinations(df['name'].unique().tolist(), 2)), columns=['node1', 'node2'])
现在我不确定如何迭代这个新数据框来填充权重。如何才能做到这一点?
最佳答案
假设每个 monthyear
中没有重复项group,你可以得到每个组内名称的所有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
关于python - 从 Pandas 数据帧创建边缘列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69216791/