读取JSON文件到pandas DataFrame报Mixing dicts with non-Series错误求助
报错原因
你遇到的报错是因为该JSON为嵌套结构,外层包含terms、license、last_updated等非数组类型的元数据字段,而实际的业务数据存储在results字段对应的数组中。直接调用pd.read_json会将结构不同的字段混合解析,触发排序歧义的错误。
解决方案
常规读取(适合中小型文件)
先将JSON全量加载为Python字典,仅提取results数组解析为DataFrame即可,若需要自动展开嵌套字典可以使用pd.json_normalize:
import pandas as pd import json with open("data.json", "r", encoding="utf-8") as f: raw_data = json.load(f) # 基础读取,嵌套字段会保留为字典格式 df = pd.DataFrame(raw_data["results"]) # 进阶:自动展开所有嵌套字典,嵌套字段会用.拼接命名,比如primarysource.qualification df_normalized = pd.json_normalize(raw_data["results"])
如果需要进一步展开reaction、drug这类嵌套列表,可指定record_path参数:
# 示例:将每个上报记录中的drug列表展开为单独行,同时保留上报id等基础信息 df_drug = pd.json_normalize( raw_data["results"], record_path=["patient", "drug"], meta=["safetyreportid", "receivedate", ["patient", "patientonsetage"]], errors="ignore" )
大文件流式读取(适合GB级大型JSON,避免内存溢出)
如果文件过大全量加载会导致内存不足,可使用ijson库流式迭代读取results字段的每一条数据,分批处理:
- 首先安装依赖:
pip install ijson - 流式读取代码示例:
import pandas as pd import ijson batch_size = 10000 result_buffer = [] # 首次写入文件先写表头 write_header = True with open("data.json", "rb") as f: # 迭代读取results数组下的每一条记录 for record in ijson.items(f, "results.item"): result_buffer.append(record) # 凑够批次大小就写入文件释放内存 if len(result_buffer) >= batch_size: batch_df = pd.json_normalize(result_buffer) batch_df.to_csv("fda_data.csv", mode="a", header=write_header, index=False, encoding="utf-8-sig") result_buffer = [] write_header = False # 处理最后不足批次大小的剩余数据 if result_buffer: batch_df = pd.json_normalize(result_buffer) batch_df.to_csv("fda_data.csv", mode="a", header=write_header, index=False, encoding="utf-8-sig")
注意事项
- 如果你的JSON结构中
results字段还有上层嵌套,按需调整ijson的读取路径即可,比如上层有data包裹就改为data.results.item - 不需要展开嵌套字段时,将
pd.json_normalize替换为pd.DataFrame即可 - 若后续需要处理列表类型字段,可单独对对应列使用
explode方法展开
内容的提问来源于stack exchange,提问作者user14435244
相关产品推荐
相关产品推荐

