Pandas MultiIndex DataFrame转换为指定嵌套JSON的实现方法
Pandas MultiIndex DataFrame 转三层嵌套JSON方案
1. 原生方法支持说明
Pandas 内置的df.to_json()没有提供直接对应这个嵌套结构的orient参数。默认使用orient='index'时,会将多层索引的组合键序列化为字符串格式的元组(例如"('2022-01-21', 'SF1_8-1')"作为单个顶层键),无法自动按索引层级拆分生成嵌套结构。
2. 代码实现
核心思路是先按第一层索引(日期)分组构造嵌套字典,再序列化为JSON,逻辑稳定,可直接复用。
第一步:构造测试样例(实际使用替换为自有DataFrame即可)
import pandas as pd import json # 匹配场景的MultiIndex DataFrame样例 df = pd.DataFrame( data=[ [100, 0.5, "A"], [200, 0.8, "B"], [150, 0.6, "C"] ], index=pd.MultiIndex.from_tuples( [ ("2022-01-21", "SF1_8-1"), ("2022-01-21", "SF1_8-2"), ("2022-01-22", "SF1_8-1") ], names=["date", "code"] ), columns=["value1", "value2", "category"] )
第二步:核心转换逻辑(鲁棒版,无单条记录报错问题)
用groupby按第一层索引切分数据,避免单分组下只有1行时触发的Series类型报错:
nested_result = {} # 按第一层日期索引分组 for date_key, group_df in df.groupby(level=0): # 移除已经分组的第一层索引,剩余二级索引直接转为「索引值: 行字段字典」的映射 nested_result[date_key] = group_df.droplevel(0).to_dict(orient='index') # 序列化为JSON字符串,ensure_ascii=False支持中文,indent设置格式化缩进 json_output = json.dumps(nested_result, ensure_ascii=False, indent=2)
输出结构示例
生成的JSON完全匹配三层嵌套要求:
{ "2022-01-21": { "SF1_8-1": { "value1": 100, "value2": 0.5, "category": "A" }, "SF1_8-2": { "value1": 200, "value2": 0.8, "category": "B" } }, "2022-01-22": { "SF1_8-1": { "value1": 150, "value2": 0.6, "category": "C" } } }
简洁写法(字典推导式版)
不需要额外处理边界的话,可以直接用一行推导式生成嵌套字典:
nested_result = { date_key: group_df.droplevel(0).to_dict(orient='index') for date_key, group_df in df.groupby(level=0) } json_output = json.dumps(nested_result, ensure_ascii=False, indent=2)
补充说明:如果第一层索引是datetime类型,需要自定义日期格式的话,可以在遍历分组时手动格式化键值,例如
date_key.strftime('%Y-%m-%d')即可输出指定格式的日期字符串。如果索引层级超过2层,按相同逻辑逐层分组嵌套即可扩展。
内容的提问来源于stack exchange,提问作者It's Me
相关产品推荐
相关产品推荐

