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

Python中如何将带层级关系的pandas DataFrame转换为嵌套字典

实现方案

实现思路

  • 先将所有DataFrame行转换为统一结构的节点字典,用id作为键存入映射表,实现O(1)时间的节点查找
  • 第二次遍历所有节点,根据parent_id将当前节点挂载到父节点的subs列表中,parent_id为0的节点直接加入最终结果
  • 可选递归清理空的subs字段,匹配示例输出的格式

完整代码

import pandas as pd
import json

# 构造DataFrame
df = pd.DataFrame(
    {
        'parent_id': [0,1,2,3,0,5,6,6],
        'id': [1,2,3,4,5,6,7,8],
        'title':['Math',
            'Algebra',
            'Polynomials',
            'sum of polynomials',
            'Physics',
            'Mechanics',
            'Kinematics ',
            'Dynamics']
    }
)

# 1. 创建id到节点的映射表
id_to_node = {}
for _, row in df.iterrows():
    id_to_node[row['id']] = {
        "id": row["id"],
        "title": row["title"].strip(), # 处理字段首尾多余空格
        "subs": []
    }

# 2. 组装层级结构
result = []
for _, row in df.iterrows():
    current_node = id_to_node[row["id"]]
    parent_id = row["parent_id"]
    if parent_id == 0:
        result.append(current_node)
    else:
        id_to_node[parent_id]["subs"].append(current_node)

# 3. 清理空subs字段,匹配示例输出格式(不需要空subs可保留此步骤,需要所有节点带subs可删除)
def drop_empty_subs(node):
    if len(node["subs"]) == 0:
        del node["subs"]
    else:
        for child in node["subs"]:
            drop_empty_subs(child)

for root_node in result:
    drop_empty_subs(root_node)

# 打印验证结果
print(json.dumps(result, ensure_ascii=False, indent=2))

运行上述代码得到的result结构和你给出的示例完全一致。

内容的提问来源于stack exchange,提问作者Владимир Кузовкин

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 23:42:03