如何调整有向图层级保证最顶层父节点始终为第一层级
问题原因
你之前的结果顺序混乱,核心原因是nx.algorithms.dag.ancestors返回的是无序集合,转成DataFrame时没有按照父子依赖的层级排序,才会出现列顺序错乱的问题。
修正后代码
import pandas as pd import networkx as nx # 构造原始DataFrame df = pd.DataFrame([ [40066, 50106], [30029, 40066], [40066, 50100], [40066, 50106], [50106, 60061], [50106, 60063], [50106, 60062], [50100, 60057], [50100, 60058] ], columns=['parent', 'child']) # 构建有向图 g = nx.from_pandas_edgelist(df, 'parent', 'child', create_using=nx.DiGraph()) # 找根节点(只出现在parent列,不出现在child列的节点) root = set(df['parent']) - set(df['child']) root = next(iter(root)) # 单根场景直接取,多根场景可自行扩展逻辑 # 找所有叶子节点(只出现在child列,不出现在parent列的节点) leaves = set(df['child']) - set(df['parent']) # 遍历每个叶子,获取从根到叶子的完整路径,按顺序拆分层级 res = [] for leaf in leaves: # 树结构DAG下根到叶子路径唯一 path = nx.shortest_path(g, source=root, target=leaf) res.append({ 'child': path[-1], 'level1': path[0], 'level2': path[1], 'level3': path[2] }) # 转成DataFrame,按child降序排序匹配你要求的输出顺序 df_res = pd.DataFrame(res).sort_values('child', ascending=False).reset_index(drop=True) print(df_res)
输出结果
运行后得到的结果完全符合要求:
| child | level1 | level2 | level3 |
|---|---|---|---|
| 60063 | 30029 | 40066 | 50106 |
| 60062 | 30029 | 40066 | 50106 |
| 60061 | 30029 | 40066 | 50106 |
| 60058 | 30029 | 40066 | 50100 |
| 60057 | 30029 | 40066 | 50100 |
如果后续层级深度不固定,可以根据路径长度动态生成level列名,不用硬编码索引,即可适配任意深度的树结构。
内容的提问来源于stack exchange,提问作者LSE Actuary
相关产品推荐
相关产品推荐

