如何使用pandas将JSON响应拆分为DataFrame的不同列?
Pandas拆分嵌套JSON为独立DataFrame列实现方案
问题背景
- 目标:将接口返回的带嵌套数组的JSON响应拆分为结构化的DataFrame列,导出为CSV
- 现有问题:直接用
pd.DataFrame()构造数据集时,嵌套的financeInfo数组会被整体存储为单列表格值,无法拆分内部的date、totalReturn字段 - 样例JSON结构:
{ "codeId": "fc-5599", "financeInfo": [ { "date": "2022-01-30", "totalReturn": 0.022425456852 }, { "date": "2022-01-30", "totalReturn": 0.022425456852 }, { "date": "2022-01-30", "totalReturn": 0.022425456852 }, { "date": "2022-01-30", "totalReturn": 0.022425456852 }, { "date": "2022-01-30", "totalReturn": 0.022425456852 } ] }
- 原有问题代码:
df = pd.DataFrame(s, columns = ["codeId","financeInfo"]) df.to_csv('data_fin.csv', index=False)
- 预期输出结构:每条
financeInfo内的记录单独成行,保留对应codeId,同时拆分出date、totalReturn两个独立列
最优实现代码
直接使用pandas内置的json_normalize接口处理嵌套JSON,这是官方针对该场景设计的高性能方案,单条/多条JSON记录均兼容:
import pandas as pd # s为存储JSON响应的变量,支持传入单个JSON对象、多个JSON对象组成的列表 df = pd.json_normalize( data=s, record_path="financeInfo", # 指定需要展开的嵌套数组路径 meta="codeId" # 指定需要保留的外层非嵌套字段 )[["codeId", "date", "totalReturn"]] # 调整列顺序匹配预期 df.to_csv('data_fin.csv', index=False)
已有DataFrame的补救方案
如果已经按照原有代码生成了带列表列的DataFrame,可以通过explode展开数组后拆分字典字段,适合临时修正场景,性能低于json_normalize:
# 展开嵌套列表为单独行 df = df.explode("financeInfo", ignore_index=True) # 拆分字典结构为独立列 df = pd.concat( [df.drop(columns="financeInfo"), df["financeInfo"].apply(pd.Series)], axis=1 )
注意:当数据量超过10万条时,优先使用
json_normalize方案,避免apply(pd.Series)带来的性能损耗。
内容的提问来源于stack exchange,提问作者user8422715
相关产品推荐
相关产品推荐

