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

如何将单行列为年份的Pandas DataFrame转为API请求JSON结构?

问题描述

场景

我有一个仅含一行数据的Pandas DataFrame,每一列对应一个年份,列值为该年份的对应数据。需将此DataFrame的数据转换为指定JSON格式结构,用于API的requests.post请求。

示例DataFrame

+-------+-------+-------+-------+-------+-------+-------------+-------------+-------------+-------------+-------------+-------------+
|       | 2020  | 2021  | 2022  | 2023  | 2024  |    2025     |    2026     |    2027     |    2028     |    2029     |    2030     |
+-------+-------+-------+-------+-------+-------+-------------+-------------+-------------+-------------+-------------+-------------+
| Total | 23648 | 20062 | 20555 | 22037 | 26208 | 28224.88801 | 29975.87934 | 31049.01582 | 32170.68853 | 33190.35298 | 34031.93951 |
+-------+-------+-------+-------+-------+-------+-------------+-------------+-------------+-------------+-------------+-------------+

目标JSON结构

parameters = {
    "first_Id":first_id,
    "version":2,
    "overrideData":[
      {
          "period":2024,          
          "TOTAL":101.64,          
      },
      {
          "period":2025,
          "TOTAL":104.20,
      }
    ]
}

问题与尝试

我尝试了以下代码,但仅生成了分离的total列表和period列表,无法得到所需的(period-TOTAL)键值对组合:

parameters = {}
parameters['first_Id'] = first_id
parameters['version'] = 2
parameters['overrideData'] = {}
parameters['overrideData']['total'] = test_input.iloc[0].tolist()         
parameters['overrideData']['period'] = list(test_input.columns)

当前错误结果

{
  "companyId": 11475,
  "version": 2,
  "overrideData": {
    "TOTAL": [
      23647.999999999996,
      20061.999999999996,
      20555,
      22036.999999999996,
      26207.999999999993,
      28224.88800768,
      29975.879336500002,
      31049.015816740008,
      32170.68852577,
      33190.3529754,
      34031.93951397
    ],
    "period": [
      2020,
      2021,
      2022,
      2023,
      2024,
      2025,
      2026,
      2027,
      2028,
      2029,
      2030
    ]
  }
}
解决方案

需要将DataFrame的列名(年份)和对应行数据一一配对,生成overrideData所需的字典列表,以下是两种实用实现方式:

方法1:直接遍历配对

循环列名和对应数值,逐个构建目标字典:

parameters = {
    "first_Id": first_id,
    "version": 2,
    "overrideData": []
}

# 获取唯一一行的数据
row_data = test_input.iloc[0]

# 遍历年份与对应数据,生成字典并添加到列表
for year, total in row_data.items():
    parameters["overrideData"].append({
        "period": int(year),  # 确保年份为整数类型
        "TOTAL": round(total, 2)  # 可选:保留两位小数,匹配示例格式
    })

方法2:使用Pandas重塑数据

借助melt函数转换DataFrame结构,再直接转为字典列表:

# 重塑DataFrame:将列转为行,对应生成period和TOTAL列
melted_df = test_input.melt(var_name="period", value_name="TOTAL")
# 转换数据类型,匹配目标格式
melted_df["period"] = melted_df["period"].astype(int)
melted_df["TOTAL"] = melted_df["TOTAL"].round(2)

# 构建最终参数字典
parameters = {
    "first_Id": first_id,
    "version": 2,
    "overrideData": melted_df.to_dict("records")
}

补充说明

  • 如果不需要保留两位小数,可移除round(total, 2)或melted_df["TOTAL"] = ...的代码
  • 若列名(年份)是字符串类型,需转为整数保证和目标结构类型一致

内容的提问来源于stack exchange,提问作者DGMS89

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:13:20