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

求助:Pandas中groupby数据集转JSON格式异常,to_excel功能正常

解决GroupBy数据集导出JSON格式错误的问题

看起来你遇到的核心问题是:GroupBy对象本身的分层结构不适合直接转JSON,而Excel导出时pandas会自动处理这些层级,所以能正常工作。下面我会结合你给出的数据集,一步步教你正确导出JSON的方法。

先还原你的数据集(方便演示)

首先我先把你给出的零散数据整理成标准的DataFrame,假设原始数据是这样的:

import pandas as pd

data = {
    "Country": ["UK", "UK", "UK", "US"],
    "Sub": ["source4", "source3", "source1", "source2"],
    "amount": [1, 1, 2, 1]  # 补全US对应的amount值
}
df = pd.DataFrame(data)

为什么直接转GroupBy对象会出错?

当你对DataFrame做groupby后,得到的是一个GroupBy迭代对象,它不是扁平的DataFrame结构,可能包含MultiIndex或者嵌套的分组数据。直接调用to_json()时,pandas无法正确解析这种分层结构,就会生成格式错误的JSON。而to_excel()会自动展开层级、处理索引,所以能正常导出。

正确的解决步骤

1. 先把GroupBy结果转换为标准DataFrame

根据你的需求,分两种常见场景处理:

场景1:按Country分组,保留每个分组内的所有Sub和amount数据

如果你想把每个国家对应的所有source和金额都嵌套在JSON里,可以用apply()把每个分组转成字典列表,再reset_index()把分组键转为列:

# 按Country分组,将每个分组的Sub和amount转为字典列表
grouped_df = df.groupby("Country").apply(
    lambda x: x[["Sub", "amount"]].to_dict("records")
).reset_index(name="sources")

场景2:按Country+Sub分组,聚合amount(比如求和)

如果你是做了聚合操作,得到的是带MultiIndex的结果,需要用reset_index()把索引转为普通列:

# 按Country和Sub分组,对amount求和
grouped_agg = df.groupby(["Country", "Sub"])["amount"].sum().reset_index()

2. 导出为格式正确的JSON

现在用to_json()导出,指定合适的orient参数控制JSON结构:

  • 用orient='records'会生成数组格式的JSON(最常用)
  • 用indent=2可以格式化JSON,方便阅读

场景1的导出代码:

json_result = grouped_df.to_json(orient="records", indent=2)
print(json_result)

输出的JSON格式如下:

[
  {
    "Country": "UK",
    "sources": [
      {
        "Sub": "source4",
        "amount": 1
      },
      {
        "Sub": "source3",
        "amount": 1
      },
      {
        "Sub": "source1",
        "amount": 2
      }
    ]
  },
  {
    "Country": "US",
    "sources": [
      {
        "Sub": "source2",
        "amount": 1
      }
    ]
  }
]

场景2的导出代码:

json_result = grouped_agg.to_json(orient="records", indent=2)
print(json_result)

输出的JSON格式如下:

[
  {
    "Country": "UK",
    "Sub": "source1",
    "amount": 2
  },
  {
    "Country": "UK",
    "Sub": "source3",
    "amount": 1
  },
  {
    "Country": "UK",
    "Sub": "source4",
    "amount": 1
  },
  {
    "Country": "US",
    "Sub": "source2",
    "amount": 1
  }
]

3. 更灵活的自定义JSON结构

如果你需要更定制化的JSON格式,可以先把DataFrame转为Python字典,再用json模块格式化:

import json

# 先转成字典
data_dict = grouped_df.to_dict("records")
# 自定义格式化
custom_json = json.dumps(data_dict, indent=2, ensure_ascii=False)
print(custom_json)

关键总结

  • 永远不要直接对GroupBy对象调用to_json(),先把它转换为标准的扁平DataFrame(用reset_index()、apply()等方法)
  • 根据你的需求选择合适的orient参数,'records'是最通用的选择
  • 如果需要嵌套结构,用apply()配合to_dict('records')来生成嵌套的字典列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:26:23