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

如何将两列pandas DataFrame转换为多级分层的多列结构?

问题解答

pandas本身没有针对这种上下游从属关系转多级层级表的内置专门方法,但你完全不需要自己手写递归实现,两种更简便的实现方案如下:

方案1:借助networkx实现(适配灵活场景)

适合层级不固定、结构复杂的从属关系,代码逻辑极简:

  • 核心思路是把两列的从属关系转为有向图,直接调用图计算库的路径查询能力获取全链路层级
import pandas as pd
import networkx as nx

# 替换为你自己的DataFrame即可
df = pd.DataFrame({
    'From': ['A', 'A', 'B', 'B', 'C'],
    'To': ['B', 'C', 'D', 'E', 'F']
})

# 1. 构建有向图
G = nx.from_pandas_edgelist(df, source='From', target='To', create_using=nx.DiGraph)
# 2. 找到所有最高层级的根节点(入度为0,没有上游节点)
roots = [n for n, d in G.in_degree() if d == 0]

all_paths = []
for root in roots:
    # 3. 遍历所有根到叶子的路径,cutoff=3表示最多取4个节点的路径,刚好对应Level_1到Level_4
    for path in nx.all_simple_paths(G, source=root, target=lambda x: G.out_degree(x) == 0, cutoff=3):
        all_paths.append(path)

# 4. 转成要求的层级表结构
level_df = pd.DataFrame(all_paths, columns=[f'Level_{i+1}' for i in range(4)])

方案2:纯pandas迭代实现(无第三方依赖)

适合层级固定的场景,你需要4级层级表只需要迭代3次即可:

# 1. 初始化第一级节点(根节点)
level_df = pd.DataFrame({'Level_1': df.loc[~df['From'].isin(df['To']), 'From'].unique()})

# 2. 迭代合并3次,依次生成Level_2到Level_4
for i in range(3):
    current_level = f'Level_{i+1}'
    next_level = f'Level_{i+2}'
    level_df = level_df.merge(df, left_on=current_level, right_on='From', how='left')\
                      .rename(columns={'To': next_level})\
                      .drop(columns=['From'])

# 3. 去重得到最终结果
level_df = level_df.drop_duplicates().reset_index(drop=True)

注意:两种方法都默认你的从属关系是无循环的有向结构,如果数据存在循环依赖,需要先做数据清洗过滤循环链路,避免遍历出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:27:03