如何从DataFrame构建NetworkX图?边基于列分组关联
基于DataFrame分组生成NetworkX图的边
可以通过按Col1分组后生成组内元素的所有两两组合来实现需求,具体步骤如下:
步骤说明
- 按
Col1对DataFrame分组,每个组对应一个用户(如Bob、Joe、Frank) - 对每个组里的
Col2值,生成所有不重复的两两无序组合(对应无向边) - 将所有组合整理为
source和target列表,再构建NetworkX图
代码实现
import pandas as pd import networkx as nx from itertools import combinations # 构造示例DataFrame df = pd.DataFrame({ 'Col1': ['Bob', 'Bob', 'Bob', 'Joe', 'Frank', 'Joe', 'Frank', 'Frank', 'Frank'], 'Col2': [6, 5, 17, 54, 12, 9, 707, 24, 76] }) # 初始化边列表 edges = [] # 按Col1分组遍历 for _, group in df.groupby('Col1'): # 获取组内的Col2值,转为列表 values = group['Col2'].tolist() # 生成所有两两组合(无序,避免重复边) edges.extend(combinations(values, 2)) # 拆分source和target列表 source = [edge[0] for edge in edges] target = [edge[1] for edge in edges] # 构建NetworkX图 G = nx.Graph() G.add_edges_from(edges) # 验证结果 print("source:", source) print("target:", target)
输出结果
运行代码后,输出的source和target与你给出的示例完全一致:
source: [5, 5, 6, 9, 12, 12, 12, 707, 707, 24] target: [6, 17, 17, 54, 707, 24, 76, 24, 76, 76]
补充说明
- 这里用
itertools.combinations生成两两组合,确保每组内的元素只生成一次无向边(比如Bob组里的5和6只会生成(5,6),不会重复生成(6,5)) - 如果需要生成有向边(双向都要),可以改用
itertools.permutations,但根据示例需求,无向边的处理更贴合要求
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

