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

求助:将父子结构Pandas DataFrame转换为层级字典

解决Pandas树形DataFrame转层级字典的问题

嘿,我明白你绕在循环里的痛苦了——树形结构的转换确实容易让人思路混乱。咱们一步步来,把这个DataFrame转成你想要的层级字典。

思路分析

你的数据是典型的树形结构:

  • 根节点是parent_id=-1的「Company」
  • 二级节点是它的子节点「Bakery」和「Frozen」
  • 三级节点是二级节点的子节点,最终要转成列表形式

咱们的核心步骤是:先把DataFrame转成内存里的树形结构,再递归遍历这个树,生成目标字典。

完整代码实现

import pandas as pd

# 你的原始数据
data = [
    {"id": 1, "parent_id": -1, "level": 1, "name": "Company"},
    {"id": 2, "parent_id": 1, "level": 2, "name": "Bakery"},
    {"id": 3, "parent_id": 1, "level": 2, "name": "Frozen"},
    {"id": 4, "parent_id": 2, "level": 3, "name": "Bread"},
    {"id": 5, "parent_id": 2, "level": 3, "name": "Pastry"},
    {"id": 6, "parent_id": 3, "level": 3, "name": "Ice Cream"},
    {"id": 7, "parent_id": 3, "level": 3, "name": "Sorbet"},
]
df = pd.DataFrame(data)

# 第一步:构建节点映射,方便快速查找每个节点的信息和子节点
node_map = {}
for _, row in df.iterrows():
    # 每个节点存储名字和子节点列表
    node_map[row["id"]] = {"name": row["name"], "children": []}

# 第二步:填充每个节点的子节点,搭建树形结构
for _, row in df.iterrows():
    parent_id = row["parent_id"]
    if parent_id != -1:  # 跳过根节点的父节点(-1)
        node_map[parent_id]["children"].append(node_map[row["id"]])

# 第三步:递归遍历树形结构,生成目标格式的层级字典
def build_hierarchy(node):
    # 检查当前节点的所有子节点是否都是叶子(没有子节点)
    all_leaf_nodes = all(not child["children"] for child in node["children"])
    if all_leaf_nodes:
        # 如果子节点都是叶子,返回名字列表
        return [child["name"] for child in node["children"]]
    # 如果子节点还有下一级,继续构建嵌套字典
    return {child["name"]: build_hierarchy(child) for child in node["children"]}

# 找到根节点(parent_id=-1的节点)
root_id = df[df["parent_id"] == -1]["id"].iloc[0]
root_node = node_map[root_id]

# 生成最终结果
result = {root_node["name"]: build_hierarchy(root_node)}
print(result)

输出结果

运行后会得到你想要的结构:

{'Company': {'Bakery': ['Bread', 'Pastry'], 'Frozen': ['Ice Cream', 'Sorbet']}}

为什么这么做?

  1. 节点映射:把每个id对应的节点信息存起来,避免反复遍历DataFrame查找父节点,效率更高。
  2. 树形结构搭建:把扁平的DataFrame转成内存里的树,让层级关系更直观。
  3. 递归生成字典:根据节点是否有子节点,动态决定返回列表还是嵌套字典,适配你的目标格式,而且就算以后有更多层级(比如level4),这个代码也能自动适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:23:13