使用pandas json_normalize处理JSON文件触发KeyError,内嵌JSON正常
问题分析与解决方案
核心问题原因
你遇到的KeyError本质是**pd.json_normalize的输入类型错误**:
- 内嵌JSON时你传的是原生Python字典/列表(符合
json_normalize的要求),所以能正常解析嵌套字段; - 读取JSON文件后,要么把
pd.read_json返回的DataFrame直接传给json_normalize(DataFrame不是原生JSON对象),要么直接给json_normalize传文件名(它不支持直接读文件),导致解析结构完全错误,自然找不到author.name这类嵌套列。
正确解决方案
方案1:先加载JSON文件为原生对象,再标准化(最直接)
先使用json模块把文件内容加载成Python列表/字典,再传给pd.json_normalize,这样就能正确解析嵌套字段:
import pandas as pd import json # 加载JSON文件为原生Python对象 with open("file.json", "r", encoding="utf-8") as f: raw_json_data = json.load(f) # 标准化嵌套JSON,生成带`author.name`的DataFrame normalized_df = pd.json_normalize(raw_json_data) # 导出指定列到CSV normalized_df[["timestamp", "author.name", "message"]].to_csv("output.csv", index=False)
方案2:基于已读取的DataFrame展开嵌套列
如果已经用pd.read_json读取了文件,不想重新加载,可以通过拆分author列来生成嵌套字段:
import pandas as pd # 先读取JSON文件得到原始DataFrame raw_df = pd.read_json("file.json") # 展开`author`列并添加前缀,再和原表合并 expanded_author = pd.json_normalize(raw_df["author"]).add_prefix("author.") normalized_df = raw_df.join(expanded_author) # 导出目标列 normalized_df[["timestamp", "author.name", "message"]].to_csv("output.csv", index=False)
为什么之前的操作会报错
pd.json_normalize(df)报错:df是pd.read_json返回的DataFrame,json_normalize会把DataFrame的列(timestamp/author/message)当成顶级JSON键,根本不会解析author列里的嵌套结构,所以找不到author.name。- 直接用
pd.json_normalize读文件报错:pd.json_normalize的第一个参数是原生JSON对象(字典/列表),不是文件名。你传文件名相当于让它解析字符串"file.json",解析后得到的是空结构,自然导出空行、找不到指定列。
内容的提问来源于stack exchange,提问作者yrg
相关产品推荐
相关产品推荐

