如何基于漫威英雄网络DataFrame重复行统计为图边添加权重?
解决方法
1. 读取数据集
先通过pandas加载漫威英雄社交网络数据集:
import pandas as pd # 读取本地的hero-network.csv文件 df = pd.read_csv('hero-network.csv')
2. 统计重复行作为边权重
针对完全重复的行(即hero1和hero2顺序完全一致的重复记录),有两种高效的统计方式:
方式一:使用groupby+size()
通过分组两列数据,直接统计每组的行数(即重复次数,也就是边的权重):
# 按hero1和hero2分组,统计每组的重复次数作为权重 weighted_edges = df.groupby(['hero1', 'hero2']).size().reset_index(name='weight')
方式二:使用value_counts()
直接调用value_counts()获取所有唯一行的计数,再转为标准DataFrame格式:
# 统计所有唯一行的出现次数,并重命名权重列 weighted_edges = df.value_counts().reset_index(name='weight')
3. (可选)处理无向图的对称边
如果你的图是无向图(比如英雄A-英雄B和英雄B-英雄A属于同一条边),需要先统一英雄对的顺序再统计:
# 对每行的两个英雄按名称排序,确保对称对被视为同一组 df['sorted_pair'] = df.apply(lambda row: tuple(sorted([row['hero1'], row['hero2']])), axis=1) # 按排序后的英雄对分组统计权重 weighted_edges = df.groupby('sorted_pair').size().reset_index(name='weight') # 将排序后的元组拆分为两列 weighted_edges[['hero1', 'hero2']] = pd.DataFrame(weighted_edges['sorted_pair'].tolist(), index=weighted_edges.index) # 移除临时辅助列 weighted_edges = weighted_edges.drop('sorted_pair', axis=1)
关键说明
- 两种基础统计方法都能快速完成去重+权重统计,适合处理大规模数据集;
- 无向图场景下必须处理对称边,否则会导致同一条边被拆分统计,权重结果错误。
内容的提问来源于stack exchange,提问作者navidabasi
相关产品推荐
相关产品推荐

