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

如何在Python的DataFrame中通过ID列生成层级路径?

实现方法

我们可以通过回溯父节点+路径拼接的方式生成层级路径,具体步骤如下:

1. 准备原始数据

先将你提供的数据转换成pandas DataFrame:

import pandas as pd

data = {
    'parent_id': [None, 1, 11, 111, 1111, None, 2, 22, 222],
    'parent_name': [None, 'b', 'b1', 'b2', 'b3', None, 'a', 'a1', 'a2'],
    'id': [1, 11, 111, 1111, 11111, 2, 22, 222, 2222],
    'name': ['b', 'b1', 'b2', 'b3', 'b4', 'a', 'a1', 'a2', 'a3'],
    'last_category': [0, 0, 0, 0, 1, 0, 0, 0, 1]
}
df = pd.DataFrame(data)

2. 构建节点映射字典

为了快速查找每个节点的父节点和名称,用id作为键,构建包含节点名称和父ID的映射:

# 生成{id: (name, parent_id)}的映射字典
node_map = df.set_index('id')[['name', 'parent_id']].to_dict('index')

3. 定义路径生成函数

编写函数,输入末级节点的id,通过回溯父节点收集从根到末的名称和ID序列,最后拼接成路径:

def generate_path(end_id):
    name_list = []
    id_list = []
    current_id = end_id
    
    # 从末级节点向上回溯到根节点(parent_id为None)
    while current_id is not None:
        node_info = node_map[current_id]
        name_list.append(node_info['name'])
        id_list.append(str(current_id))
        current_id = node_info['parent_id']
    
    # 反转列表,得到从根到末的顺序
    name_list.reverse()
    id_list.reverse()
    
    # 用" / "拼接成路径字符串
    return ' / '.join(name_list), ' / '.join(id_list)

4. 生成目标DataFrame

筛选出last_category=1的行,对每行的id应用路径生成函数,整理成目标格式:

# 筛选所有末级节点
last_category_rows = df[df['last_category'] == 1]

# 生成路径并转换成DataFrame
df_last = last_category_rows['id'].apply(
    lambda x: pd.Series(generate_path(x), index=['name_path', 'id_path'])
).reset_index(drop=True)

# 查看结果
print(df_last)

运行后得到的结果如下(注:你提供的目标结果中第二行name_path的a4应为笔误,实际对应原始数据的a3):

name_path                  id_path
0  b / b1 / b2 / b3 / b4  1 / 11 / 111 / 1111 / 11111
1        a / a1 / a2 / a3        2 / 22 / 222 / 2222

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:55:30