高效将Injixo WFM API嵌套JSON转换为展开式Pandas DataFrame
解决Injixo WFM API嵌套JSON转Pandas DataFrame的高效方法
问题场景
从Injixo WFM API返回的嵌套JSON数据构建DataFrame时,JSON中的values字段是数值列表。需要将每个数值单独拆分为一行,同时保留对应行的date、curve_event_type_id、curve_id等关联字段信息。此前尝试的循环拼接Series效率极低,使用pd.json_normalize仅指定record_path会丢失关联字段,apply lambda的方式也未解决问题。
假设API返回的JSON结构示例
[ { "date": "2024-01-01", "curve_event_type_id": 123, "curve_id": 456, "curve_values": { "values": [10, 20, 30] } }, { "date": "2024-01-02", "curve_event_type_id": 124, "curve_id": 457, "curve_values": { "values": [15, 25] } } ]
高效解决方案
方法1:pd.json_normalize配合meta参数(推荐)
这是最直接高效的方式,通过record_path指定要展开的列表字段,同时用meta参数保留所有需要的关联字段:
import pandas as pd # api_response为从Injixo API获取的JSON数据 api_response = [...] df = pd.json_normalize( data=api_response, record_path=['curve_values', 'values'], # 指向要拆分行的嵌套列表路径 meta=['date', 'curve_event_type_id', 'curve_id'] # 列出需要保留的关联字段 ) # 给展开后的数值列重命名(可选) df.rename(columns={'0': 'value'}, inplace=True)
此方法利用Pandas原生优化的函数,避免手动循环,处理大数据量时效率优势明显。
方法2:用explode展开已有的列表列
如果已经将原始JSON转换为包含values列表列的初始DataFrame,可直接使用explode函数展开:
# 先生成初始DataFrame initial_df = pd.json_normalize(api_response) # 展开values列表,重置索引 final_df = initial_df.explode('curve_values.values').reset_index(drop=True) # 重命名数值列(可选) final_df.rename(columns={'curve_values.values': 'value'}, inplace=True)
explode是Pandas专门用于展开列表类型列的函数,性能远优于手动循环或apply lambda。
对之前错误方法的说明
- 循环拼接Series:时间复杂度为O(n*m)(n为行数,m为列表长度),数据量大时性能极差,完全不推荐。
- 仅指定
record_path的json_normalize:未通过meta参数声明需要保留的关联字段,导致顶层字段丢失,属于用法遗漏。 - apply lambda生成DataFrame:本质还是逐行循环,性能和手动拼接无差异,不如原生函数高效。
内容的提问来源于stack exchange,提问作者ServiceCode
相关产品推荐
相关产品推荐

