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

Python中如何按指定规则转换API返回的DataFrame数据

解决方案

需求回顾

需要将API返回的DataFrame转换为指定格式:

  • 输入DataFrame固定包含7列:EntityID、EntityName、ForYear、Labels、FiscalPeriodValue、ForDate,最后一列为数值列
  • 按ForDate分组,每组生成一条数据,包含:
    • D:对应ForDate
    • Y:对应ForYear(同组内值一致)
    • L1/L2/L3...:对应同组内的Labels,顺序与EntityName的顺序一致
    • 各EntityName作为键,对应数值列的值

完善后的代码

import pandas as pd

# 示例输入数据
data = [
    {'EntityID': 3, 'EntityName': 'Trading Value', 'ForDate': '2023-07-13', 'Labels': '2023-07-13', 'FiscalPeriodValue': 'Daily', 'ForYear': 2023, 'DataValue': 7.7},
    {'EntityID': 4, 'EntityName': 'Quarterly average', 'ForDate': '2023-07-13', 'Labels': '2023-Q3', 'FiscalPeriodValue': 'Daily', 'ForYear': 2023, 'DataValue': 7.05},
    {'EntityID': 5, 'EntityName': 'Yearly average', 'ForDate': '2023-07-13', 'Labels': '2023', 'FiscalPeriodValue': 'Daily', 'ForYear': 2023, 'DataValue': 5.21},
    # 可添加不同ForDate的测试数据
    {'EntityID': 3, 'EntityName': 'Trading Value', 'ForDate': '2023-07-14', 'Labels': '2023-07-14', 'FiscalPeriodValue': 'Daily', 'ForYear': 2023, 'DataValue': 8.1},
    {'EntityID': 4, 'EntityName': 'Quarterly average', 'ForDate': '2023-07-14', 'Labels': '2023-Q3', 'FiscalPeriodValue': 'Daily', 'ForYear': 2023, 'DataValue': 7.2},
    {'EntityID': 5, 'EntityName': 'Yearly average', 'ForDate': '2023-07-14', 'Labels': '2023', 'FiscalPeriodValue': 'Daily', 'ForYear': 2023, 'DataValue': 5.3}
]

df = pd.DataFrame(data)

# 获取数值列的列名(最后一列)
ValueColumn = df.columns[-1]

# 分组处理:同时收集实体值映射、标签列表、年份
grouped_data = df.groupby('ForDate').apply(
    lambda x: {
        'entity_values': dict(zip(x['EntityName'], x[ValueColumn])),
        'labels': x['Labels'].tolist(),
        'year': x['ForYear'].iloc[0]
    }
).reset_index()

# 生成最终格式的数据
new_dataset = grouped_data.apply(
    lambda row: {
        'D': row['ForDate'],
        'Y': row['year'],
        # 将标签列表转换为L1、L2、L3...的键值对
        **{f'L{i+1}': label for i, label in enumerate(row['labels'])},
        **row['entity_values']
    },
    axis=1
).tolist()

# 打印结果
import json
print(json.dumps(new_dataset, indent=2))

代码说明

  1. 自动识别数值列:通过df.columns[-1]获取最后一列的列名,适配不同的数值列命名
  2. 分组逻辑优化:在groupby的apply中一次性收集三个关键信息:
    • entity_values:保留原代码的实体名称与数值的映射逻辑
    • labels:同组内的Labels列表,完全遵循原数据中EntityName的顺序
    • year:同组内的ForYear值(取第一个即可,因为同组内值一致)
  3. 动态生成标签列:用字典推导式将labels列表转为L1、L2...格式,即使实体数量不是3个也能正常适配
  4. 合并字典数据:通过字典解包**将各部分数据整合为最终的单条记录

输出示例

[
  {
    "D": "2023-07-13",
    "Y": 2023,
    "L1": "2023-07-13",
    "L2": "2023-Q3",
    "L3": "2023",
    "Trading Value": 7.7,
    "Quarterly average": 7.05,
    "Yearly average": 5.21
  },
  {
    "D": "2023-07-14",
    "Y": 2023,
    "L1": "2023-07-14",
    "L2": "2023-Q3",
    "L3": "2023",
    "Trading Value": 8.1,
    "Quarterly average": 7.2,
    "Yearly average": 5.3
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:00:41