You need to enable JavaScript to run this app. Pandas边表转NetworkX时双向边权重求和聚合方法咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 16:36:03