Python中如何从pandas DataFrame获取networkx图的根节点分支路径列表
实现方案
你可以通过networkx直接实现需求,代码逻辑简单易维护,具体步骤如下:
方案1:基于networkx实现(推荐)
你已经用到了networkx绘制网络图,可以直接复用已构建的图结构完成路径提取:
import pandas as pd import networkx as nx # 1. 构建有向图 G = nx.from_pandas_edgelist(df, source='From', target='To', create_using=nx.DiGraph()) # 2. 筛选所有叶子节点(出度为0,没有下游节点的节点) leaf_nodes = [node for node, out_degree in G.out_degree() if out_degree == 0] # 3. 提取从Node1到所有叶子节点的路径 result = [] for leaf in leaf_nodes: # 取两点之间的唯一简单路径 path = next(nx.all_simple_paths(G, source='Node1', target=leaf)) result.append('-'.join(path)) print(result)
运行输出结果:
['Node1-Node2-Node4-Node8', 'Node1-Node2-Node5-Node9', 'Node1-Node3-Node6-Node10', 'Node1-Node3-Node7-Node11']
方案2:纯Python递归实现(无需额外依赖)
如果你不想引入networkx依赖,可以直接基于pandas生成邻接表后递归遍历:
import pandas as pd # 1. 构建节点邻接表 adj_table = df.groupby('From')['To'].apply(list).to_dict() result = [] # 2. 递归遍历路径 def dfs(node, current_path): current_path.append(node) # 当前节点没有下游节点,即为路径终点 if node not in adj_table: result.append('-'.join(current_path)) return # 遍历所有下游节点继续递归 for next_node in adj_table[node]: dfs(next_node, current_path.copy()) dfs('Node1', []) print(result)
运行结果和方案1完全一致。
内容的提问来源于stack exchange,提问作者hbstha123
相关产品推荐
相关产品推荐

