如何将单行列为年份的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
相关产品推荐
相关产品推荐

