Pandas边表转NetworkX时双向边权重求和聚合方法咨询
无向边双向权重合并解决方案
解决思路为:先在Pandas层对边表做无向化去重+权重聚合,再传入NetworkX建图,全程为线性时间复杂度,内存占用远低于邻接矩阵方案,完全适配400万行规模的边表。
步骤1:规范化边的节点顺序
不管原边是A→B还是B→A,统一将字典序/数值更小的节点放在第一列,更大的放在第二列,让双向边的行键完全一致。
import pandas as pd import networkx as nx import numpy as np # 规范化无向边的节点顺序,支持数值、字符串类型的节点ID df['u'] = np.minimum(df['Customer_A'], df['Customer_B']) df['v'] = np.maximum(df['Customer_A'], df['Customer_B'])
步骤2:分组聚合计算总权重
按照规范化后的u、v列分组,对Weight列求和,得到去重后的无向边表:
# 聚合双向边权重,400万行数据可在普通配置机器上完成,无内存溢出风险 undirected_edges = df.groupby(['u', 'v'], as_index=False)['Weight'].sum()
步骤3:用处理后的边表建图
直接将聚合后的边表传入NetworkX的from_pandas_edgelist方法即可,此时不会有重复边,权重已经是双向边的总和:
G = nx.from_pandas_edgelist(undirected_edges, 'u', 'v', 'Weight')
效果验证
你提到的测试场景:
原始边:Customer1→Customer2 权重320;Customer2→Customer1 权重100
规范化后两行的u、v均为(Customer1, Customer2),分组求和后权重为420,完全符合预期。
如果边表还包含其他需要保留的字段,在groupby阶段补充对应的聚合规则即可。
内容的提问来源于stack exchange,提问作者hristogg
相关产品推荐
相关产品推荐

