如何将多层级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
相关产品推荐
相关产品推荐

