You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从具有4级多层索引的Pandas DataFrame生成嵌套JSON?

解决Pandas多层索引DataFrame生成指定嵌套JSON结构的问题

我完全懂你的困扰——Pandas自带的df.to_json()里的那些orient参数,确实没办法直接生成你想要的Name→Year→Month→Date这种深度嵌套的层级结构。默认的选项要么把多层索引揉成扁平的键,要么嵌套逻辑和需求不匹配。不过没关系,我们可以手动构建这个嵌套结构,再转换成JSON,完美贴合你的预期。

第一步:先搞个示例DataFrame(方便测试)

先创建一个和你结构一致的测试数据,这样你可以直接跑代码验证:

import pandas as pd
import numpy as np
import json

# 生成4级多层索引的测试数据
names = ["Alice", "Bob"]
years = [2022, 2023]
months = [1, 2]
dates = [1, 2]

multi_index = pd.MultiIndex.from_product(
    [names, years, months, dates],
    names=["Name", "Year", "Month", "Date"]
)

df = pd.DataFrame(
    {
        "col1": np.random.randint(1, 100, size=len(multi_index)),
        "col2": np.random.randn(len(multi_index))
    },
    index=multi_index
)

第二步:手动构建嵌套结构

我们通过逐层分组的方式,把每一层索引对应的嵌套关系搭起来。这里分四层处理,每一层都用groupby按索引级别拆分:

def build_custom_nested(df):
    nested_result = {}
    
    # 第一层:按Name分组
    for name, name_data in df.groupby(level="Name"):
        nested_result[name] = {}
        
        # 第二层:在Name下按Year分组
        for year, year_data in name_data.groupby(level="Year"):
            nested_result[name][year] = {}
            
            # 第三层:在Year下按Month分组
            for month, month_data in year_data.groupby(level="Month"):
                nested_result[name][year][month] = {}
                
                # 第四层:在Month下按Date对应列值
                for date, date_row in month_data.groupby(level="Date"):
                    # 格式1:列值字典(和你示例描述一致)
                    nested_result[name][year][month][date] = {
                        "col1": date_row["col1"].iloc[0],
                        "col2": date_row["col2"].iloc[0]
                    }
                    # 格式2:列值列表(如果需要的话)
                    # nested_result[name][year][month][date] = [date_row["col1"].iloc[0], date_row["col2"].iloc[0]]
    
    return nested_result

# 生成嵌套结构
nested_data = build_custom_nested(df)
# 转成带缩进的JSON
final_json = json.dumps(nested_data, indent=4)
print(final_json)

为什么不用df.to_json()的orient参数?

简单说,现有参数都满足不了你的需求:

  • orient='index':会把多层索引转成类似("Alice",2022,1,1)这样的元组键,不是嵌套字典;
  • orient='hierarchical':虽然支持多层索引,但嵌套逻辑是从最内层到最外层(或者反过来),而且结构是把索引层级用点分隔,不是你要的Name→Year→Month→Date的逐层嵌套;
  • 其他比如'records'、'columns'都是针对非多层索引的场景,完全不适用。

优化提示(如果数据量大)

如果你的DataFrame行数特别多,上面的四层循环可能有点慢。这时候可以考虑用df.reset_index()把索引转成列,然后用递归或者pivot的方式构建嵌套,但对于大多数常规规模的数据,上面的方法足够清晰、容易调试。

内容的提问来源于stack exchange,提问作者skwasif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:18:52