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

如何将多层级Pandas DataFrame转换为指定结构的嵌套JSON

DataFrame转指定层级嵌套JSON实现方案

结论:仅靠原生df.to_json()无法直接生成你需要的三层嵌套结构,也不需要编写多层嵌套循环硬拼字典,基于pandas分组聚合做轻量结构化处理即可实现,代码可维护性和运行效率都更高。

核心原因

原生多层索引调用to_json()时,只会将多层索引平铺为键名,不会自动识别字段的模块归属关系,因此无法直接输出「住客信息→访问数据(酒店详情)→measurements(每日收费)」的嵌套层级。

实现代码

import pandas as pd
import json

# 以下为示例DataFrame,可替换为你的实际数据
df = pd.DataFrame({
    "guest_id": ["G001", "G001", "G002"],
    "guest_name": ["张三", "张三", "李四"],
    "contact_phone": ["13xxxxxxxxx", "13xxxxxxxxx", "138yyyyyyyy"],
    "hotel_id": ["H01", "H01", "H02"],
    "hotel_name": ["XX连锁朝阳店", "XX连锁朝阳店", "XX连锁海淀店"],
    "stat_date": ["2024-05-01", "2024-05-02", "2024-05-20"],
    "room_charge": [299, 299, 359],
    "service_charge": [30, 20, 40]
})

output = []
# 按住客唯一ID分组拆分独立文档
for _, guest_group in df.groupby("guest_id"):
    # 提取顶层住客基础信息
    single_guest = guest_group[["guest_id", "guest_name", "contact_phone"]].iloc[0].to_dict()
    # 挂载酒店详情到visit_data节点
    single_guest["visit_data"] = guest_group[["hotel_id", "hotel_name"]].iloc[0].to_dict()
    # 挂载每日收费明细到measurements节点
    single_guest["measurements"] = guest_group[["stat_date", "room_charge", "service_charge"]].to_dict("records")
    output.append(single_guest)

# 导出为格式化JSON文件
with open("guest_split_docs.json", "w", encoding="utf-8") as f:
    json.dump(output, f, ensure_ascii=False, indent=2)

输出结构对照

生成的单条住客文档完全匹配需求层级:

{
  "guest_id": "G001",
  "guest_name": "张三",
  "contact_phone": "13xxxxxxxxx",
  "visit_data": {
    "hotel_id": "H01",
    "hotel_name": "XX连锁朝阳店"
  },
  "measurements": [
    {"stat_date": "2024-05-01", "room_charge": 299, "service_charge": 30},
    {"stat_date": "2024-05-02", "room_charge": 299, "service_charge": 20}
  ]
}

优化提示

如果你的数据量超过10万条,可以把分组后的字段提取逻辑替换为pandas内置的agg聚合写法,避免逐行循环的性能损耗,核心嵌套逻辑和上述方案一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:21:20