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,提问作者Владимир Кузовкин
相关产品推荐
相关产品推荐

