
本文介绍如何使用 pandas 和标准 json 模块,将多个 DataFrame 转换为结构清晰、字段命名明确的嵌套 JSON 对象,并写入格式化文件。核心在于避免直接拼接字符串或误用 to_json(),而应通过 to_dict('records') 构建字典结构再序列化。
本文介绍如何使用 pandas 和标准 json 模块,将多个 dataframe 转换为结构清晰、字段命名明确的嵌套 json 对象,并写入格式化文件。核心在于避免直接拼接字符串或误用 `to_json()`,而应通过 `to_dict('records')` 构建字典结构再序列化。
在数据处理与 API 对接场景中,常需将多个 Pandas DataFrame 整合为一个具有语义化键名(如 "StatusTimes"、"DtCount")的嵌套 JSON 文件。直接调用 df.to_json() 仅能生成扁平数组,无法满足层级封装需求;而手动构造 JSON 字符串易出错且难以维护。正确做法是:先用 to_dict('records') 将每个 DataFrame 转为标准 Python 字典列表,再组合成嵌套字典,最后用 json.dump() 或 json.dumps() 序列化输出。
以下为完整实现步骤与示例代码:
✅ 正确构建嵌套 JSON 的推荐方式
假设你已准备好两个 DataFrame:df_status(含 time, x, y, z 列)和 df_dt(含 dt, count 列),可按如下方式构建目标结构:
import pandas as pd
import json
# 示例数据(实际中替换为你自己的 DataFrame)
df_status = pd.DataFrame([
{"time": 1677287760000, "x": 0.001, "y": 0.001, "z": 0.0},
{"time": 1677632400000, "x": 0.0, "y": 0.0, "z": 0.0},
{"time": 1677636000000, "x": 0.0, "y": 0.0, "z": 0.0},
{"time": 1677639600000, "x": 0.0, "y": 0.0, "z": 0.0}
])
df_dt = pd.DataFrame([
{"dt": 20, "count": 6},
{"dt": 23, "count": 9},
{"dt": 11, "count": 7},
{"dt": 2, "count": 16},
{"dt": 17, "count": 1},
{"dt": 20, "count": 6}
])
# ✅ 关键:使用 to_dict('records') 生成标准字典列表(非 JSON 字符串!)
nested_data = {
"StatusTimes": df_status.to_dict('records'),
"DtCount": df_dt.to_dict('records')
}
# 写入格式化 JSON 文件(缩进 4 空格,中文不转义)
with open("output.json", "w", encoding="utf-8") as f:
json.dump(nested_data, f, indent=4, ensure_ascii=False)
执行后,output.json 将生成完全符合预期的嵌套结构,包含可读性良好的缩进与换行。
⚠️ 常见误区与注意事项
- ❌ 不要对 to_json() 结果再解析:df.to_json() 返回字符串,若尝试 json.loads(df.to_json()) 再合并,不仅低效,还可能因 NaN/时间戳等类型导致序列化失败。
- ✅ to_dict('records') 是最佳桥梁:它保持原始数据类型(int, float, None → null),且输出为纯 Python list-of-dict,天然兼容 json.dump()。
- 编码与可读性:务必指定 encoding="utf-8" 并使用 ensure_ascii=False,避免中文乱码;indent=4 提升调试与协作可读性。
- 空 DataFrame 安全性:to_dict('records') 对空 DataFrame 返回 [],无需额外判空,结构依然合法。
- 扩展性提示:如需动态添加更多数据集(如 "Events"、"Metadata"),只需在 nested_data 字典中追加键值对即可,逻辑清晰、易于维护。
✅ 总结
构建嵌套 JSON 的本质是「结构先行、数据填充、序列化落地」。牢记三步法:
- 用 df.to_dict('records') 将每个 DataFrame 转为字典列表;
- 将其作为值,填入以业务语义命名的顶层键(如 "StatusTimes")构成嵌套字典;
- 使用 json.dump(..., indent=4) 写入文件,兼顾正确性与可维护性。
该方法轻量、健壮、符合 Python 数据工程最佳实践,适用于日志聚合、配置导出、前端数据接口准备等多种场景。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











