pandas.read_json() 直接读取嵌套 JSON 容易失败,因其仅解析顶层结构、不递归展开,遇多层嵌套、混合类型或缺失键会报错或生成大量 NaN;应先用 json.load() 转为 Python 对象,再依结构选用 pd.json_normalize() 配合 record_path 和 meta 精准展平。

用 pandas.read_json() 直接读取嵌套 JSON 容易失败
多数人第一反应是 pandas.read_json() 一把梭,但遇到多层嵌套、混合类型(如 list + dict 混在同个字段)、或存在缺失键的 JSON,它会直接报 ValueError: arrays must all be same length 或生成大量 NaN 列。根本原因是 pandas 默认不做递归展开,只解析顶层结构。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 先用
json.load()读入 Python 原生对象,再人工判断结构深度——尤其注意含list的字段(比如"items": [{"id":1,"tags":["a","b"]}]),这类必须扁平化 - 对含列表的字段,优先用
pd.json_normalize()替代read_json(),它专为嵌套设计,支持record_path和meta参数定位子结构 - 如果顶层是 list(常见于 API 返回),
pd.json_normalize(data)可直接处理;如果是 dict 包裹 list(如{"results": [...]}),得先取data["results"]再传入
pd.json_normalize() 的三个关键参数怎么配
这个函数不是“自动变平”,参数组合决定结果形态。漏掉或错配会导致列名混乱、数据错位,甚至丢行。
实操建议:
立即学习“Python免费学习笔记(深入)”;
-
record_path:指定要展开成行的最深层 list 路径,用 list 表示层级,例如["data", "items"];若该路径不存在,会报KeyError -
meta:提取上层字段作为每行的固定列,支持字符串(单字段)或 list(多字段),如["id", "timestamp"];若字段嵌套,写成["user", "name"] -
errors="ignore"必须显式加上——当某条记录缺record_path中的 key 时,否则直接中断;配合meta使用时,缺 meta 字段的记录该列会是NaN
示例:pd.json_normalize(data, record_path=["orders"], meta=["customer_id", ["address", "city"]], errors="ignore")
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
列表字段(如 tags、permissions)变成多行还是单行?
原始 JSON 里一个用户有 "tags": ["admin", "beta"],Excel 里该占一行(用逗号拼接)还是拆成两行(一对多)?这直接影响后续分析逻辑,且 json_normalize 默认不处理这种“一变多”。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 若需保留原始结构做筛选(如“查所有带 beta 标签的用户”),用
explode():先df["tags"] = df["tags"].apply(lambda x: x if isinstance(x, list) else []),再df.explode("tags") - 若仅需展示汇总(如导出报表),用
df["tags"] = df["tags"].apply(lambda x: ",".join(x) if isinstance(x, list) else "") - 避免直接用
str()转 list——会产生"['a', 'b']"这种带括号引号的字符串,后续无法按标签切分
写入 Excel 时中文乱码、日期变数字、长数字变科学计数
df.to_excel() 看似简单,但默认引擎和格式控制缺失,导出后 Excel 打开就是灾难现场:中文显示为方块、时间戳变成 44205、身份证号末尾变 000。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 必须用
openpyxl引擎:df.to_excel("out.xlsx", engine="openpyxl", index=False);xlsxwriter不支持写入已存在样式,且对中文兼容更差 - 日期列提前转
datetime类型,再用dt.strftime()格式化,否则 Excel 识别为数值;例如df["created_at"] = pd.to_datetime(df["created_at"]).dt.strftime("%Y-%m-%d %H:%M") - 长数字(如订单号、手机号)列,在读入后立刻转成 string:
df["order_id"] = df["order_id"].astype(str),防止 pandas 自动转 float 导致精度丢失
复杂点在于嵌套结构往往伴随多种数据类型混杂,同一列可能同时出现 dict、list、None、string——必须逐列检查 df[col].apply(type).unique(),再针对性清洗,跳过这步,Excel 里就只剩一堆 TypeError 和空单元格。

















