求助:将父子结构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']}}
为什么这么做?
- 节点映射:把每个id对应的节点信息存起来,避免反复遍历DataFrame查找父节点,效率更高。
- 树形结构搭建:把扁平的DataFrame转成内存里的树,让层级关系更直观。
- 递归生成字典:根据节点是否有子节点,动态决定返回列表还是嵌套字典,适配你的目标格式,而且就算以后有更多层级(比如level4),这个代码也能自动适配。
内容的提问来源于stack exchange,提问作者ajrlewis
相关产品推荐
相关产品推荐

