Python中如何按指定规则转换API返回的DataFrame数据
解决方案
需求回顾
需要将API返回的DataFrame转换为指定格式:
- 输入DataFrame固定包含7列:
EntityID、EntityName、ForYear、Labels、FiscalPeriodValue、ForDate,最后一列为数值列 - 按
ForDate分组,每组生成一条数据,包含:D:对应ForDateY:对应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))
代码说明
- 自动识别数值列:通过
df.columns[-1]获取最后一列的列名,适配不同的数值列命名 - 分组逻辑优化:在
groupby的apply中一次性收集三个关键信息:entity_values:保留原代码的实体名称与数值的映射逻辑labels:同组内的Labels列表,完全遵循原数据中EntityName的顺序year:同组内的ForYear值(取第一个即可,因为同组内值一致)
- 动态生成标签列:用字典推导式将
labels列表转为L1、L2...格式,即使实体数量不是3个也能正常适配 - 合并字典数据:通过字典解包
**将各部分数据整合为最终的单条记录
输出示例
[ { "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
相关产品推荐
相关产品推荐

