如何将Pandas DataFrame转换为指定层级结构的嵌套JSON?
把Pandas DataFrame转成品牌-型号-年份的嵌套JSON
嘿,这个需求我做移动端后端接口的时候刚好实现过,6700行的DataFrame完全没问题,用Pandas的分组+自定义函数就能轻松搞定符合层级要求的嵌套JSON,我给你一步步拆解:
核心思路
我们要按「品牌→型号→年份→剩余数据」的层级嵌套,本质就是逐层分组,把每一层的分组结果转成字典,最后再整体转成JSON。
具体实现步骤
假设你的DataFrame列名包含品牌、型号、年份,剩下的40列是需要放在Level3的业务数据。
1. 导入依赖
import pandas as pd import json
2. 定义层级转换函数
我们从最内层开始定义函数,逐步向外嵌套:
- 最内层:把每个年份对应的剩余列转成字典(如果同一年份有多条数据,改成列表即可)
- 中间层:把每个型号对应的所有年份数据转成字典
- 最外层:把每个品牌对应的所有型号数据转成字典
def year_to_detail(group): # 移除分组用的列,把剩余数据转成字典 # 如果同一年份有多条数据,把to_dict('records')[0]改成to_dict('records')即可得到列表 return group.drop(['品牌', '型号', '年份'], axis=1).to_dict('records')[0] def model_to_years(group): # 按年份分组,调用内层函数转换,转成字典 return group.groupby('年份').apply(year_to_detail).to_dict() def brand_to_models(group): # 按型号分组,调用中间层函数转换,转成字典 return group.groupby('型号').apply(model_to_years).to_dict()
3. 生成嵌套结构并转JSON
假设你的DataFrame名为df,执行以下代码:
# 生成嵌套字典 nested_dict = df.groupby('品牌').apply(brand_to_models).to_dict() # 转成JSON,ensure_ascii=False保留中文,indent=2让格式更美观(移动端解析不影响,只是方便调试) json_result = json.dumps(nested_dict, ensure_ascii=False, indent=2)
示例效果
假设你的DataFrame有如下数据:
| 品牌 | 型号 | 年份 | 存储容量 | 系统版本 |
|---|---|---|---|---|
| 苹果 | iPhone14 | 2022 | 128G | iOS16 |
| 苹果 | iPhone14 | 2023 | 256G | iOS17 |
| 华为 | Mate50 | 2022 | 256G | HarmonyOS3 |
转换后的JSON会是:
{ "苹果": { "iPhone14": { "2022": { "存储容量": "128G", "系统版本": "iOS16" }, "2023": { "存储容量": "256G", "系统版本": "iOS17" } } }, "华为": { "Mate50": { "2022": { "存储容量": "256G", "系统版本": "HarmonyOS3" } } } }
注意事项
- 空值处理:如果
品牌/型号/年份列有空值,分组会出错,建议先执行df = df.dropna(subset=['品牌', '型号', '年份'])清理数据 - 重复数据处理:如果同一个「品牌-型号-年份」组合有多条数据,把
year_to_detail里的to_dict('records')[0]改成to_dict('records'),这样年份对应的就是一个数据列表 - 性能优化:6700行的数据用这种方法完全没问题,如果数据量更大,可以考虑用
iterrows循环构建字典,效率会更高一些
内容的提问来源于stack exchange,提问作者Fatih Can
相关产品推荐
相关产品推荐

