如何从列值为邻接节点元组的Pandas DataFrame构建NetworkX图
解决方案
核心逻辑:nx.from_pandas_edgelist要求每行对应一条边的两个独立节点,所以只需要提前把存储邻接节点列表/元组的列拆分为多行,每个邻接节点单独占一行即可,pandas内置的explode方法可以一步完成这个操作。
方法1:explode转换后直接调用接口(推荐,代码最简洁)
import networkx as nx import pandas as pd data = [[1,(2,4)],[2, (1,3)], [3, (1,2,3)], [4, (1)]] exdf = pd.DataFrame(data, columns = ["A","B"]) # 先统一处理B列的单个值(避免形如(1)被识别为int而非元组的情况) exdf['B'] = exdf['B'].apply(lambda x: (x,) if isinstance(x, (int, str)) else x) # 炸开B列,每个邻接节点单独占一行 exdf_exploded = exdf.explode('B') # 正常构建图 G = nx.from_pandas_edgelist(exdf_exploded, source="A", target="B") # 验证结果 print(G.edges()) # 输出:[(1, 2), (1, 4), (1, 3), (2, 3), (3, 3)]
适用条件:pandas 0.25及以上版本支持explode方法,绝大多数运行环境都满足要求。
方法2:遍历行加边(兼容性更好)
如果使用的pandas版本过低不支持explode,可以直接遍历每行手动加边,逻辑也很清晰:
G = nx.Graph() for _, row in exdf.iterrows(): source_node = row['A'] target_nodes = row['B'] # 统一转为元组处理单个值的情况 if not isinstance(target_nodes, (tuple, list)): target_nodes = (target_nodes,) # 批量加边 G.add_edges_from((source_node, t) for t in target_nodes)
内容的提问来源于stack exchange,提问作者winawer
相关产品推荐
相关产品推荐

