Python中实现DataFrame到多层嵌套字典的通用转换
将Pandas DataFrame转换为可变层级的嵌套字典结构
需求说明
给定层级化的Pandas DataFrame(示例包含region、sub_region、state三级),需要将其转换为指定格式的嵌套字典:
- 每个节点以
name字段标识 - 非叶子节点包含
children字段,子节点为下一层级的结构 - 叶子节点(最底层)不包含
children字段 - 要求实现支持任意层级数量的通用转换逻辑
通用解决方案
以下是基于递归实现的通用转换函数,可适配任意层级的DataFrame结构:
import pandas as pd import json def df_to_nested_dict(df, hierarchy): def build_level(group, level_index): # 到达最后一层,返回仅含name的字典列表 if level_index == len(hierarchy) - 1: return [{"name": val} for val in group[hierarchy[level_index]].unique()] # 按当前层级字段分组,递归构建子节点 grouped_data = group.groupby(hierarchy[level_index]) nodes = [] for node_name, sub_group in grouped_data: child_nodes = build_level(sub_group, level_index + 1) current_node = {"name": node_name} # 仅当存在子节点时添加children键 if child_nodes: current_node["children"] = child_nodes nodes.append(current_node) return nodes return build_level(df, 0) # 测试示例数据 region = ['A','A','A','B','B','B'] sub_region = ['1','2','2','3','3','4'] state = ['a','b','c','d','e','f'] df = pd.DataFrame({"region": region, "sub_region": sub_region, "state": state}) # 执行转换并打印结果 result = df_to_nested_dict(df, ['region', 'sub_region', 'state']) print(json.dumps(result, indent=2))
输出结果
运行上述代码后,将得到符合要求的嵌套字典:
[ { "name": "A", "children": [ { "name": "1", "children": [ { "name": "a" } ] }, { "name": "2", "children": [ { "name": "b" }, { "name": "c" } ] } ] }, { "name": "B", "children": [ { "name": "3", "children": [ { "name": "d" }, { "name": "e" } ] }, { "name": "4", "children": [ { "name": "f" } ] } ] } ]
函数说明
- 参数:
df:需要转换的Pandas DataFramehierarchy:层级字段的列表,按从顶层到底层的顺序排列(如['region', 'sub_region', 'state'])
- 核心逻辑:
- 递归遍历每一层级,通过
groupby对当前层级字段分组 - 最后一层直接生成仅含
name的字典 - 非最后一层递归处理子分组,为节点添加
children字段(仅当存在子节点时)
- 递归遍历每一层级,通过
- 灵活性:
- 可适配任意数量的层级,例如若层级为
['region', 'state'],函数会自动生成二级嵌套结构
- 可适配任意数量的层级,例如若层级为
内容的提问来源于stack exchange,提问作者Zach Kramer
相关产品推荐
相关产品推荐

