如何在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
相关产品推荐
相关产品推荐

