You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整有向图层级保证最顶层父节点始终为第一层级

问题原因

你之前的结果顺序混乱,核心原因是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)

输出结果

运行后得到的结果完全符合要求:

childlevel1level2level3
60063300294006650106
60062300294006650106
60061300294006650106
60058300294006650100
60057300294006650100

如果后续层级深度不固定,可以根据路径长度动态生成level列名,不用硬编码索引,即可适配任意深度的树结构。

内容的提问来源于stack exchange,提问作者LSE Actuary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:06:05