You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

高效将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:20:25