如何展平含非固定属性的字典列表并生成规整Pandas数据表
问题根因
原有通用展平逻辑按照嵌套数组的下标生成列名,强依赖ExtendedAttributeValues数组内元素的固定顺序、固定返回数量。API变更后不同位置返回的扩展属性集合、顺序都不固定,自然会出现列值错位、匹配错误的问题。
处理思路
放弃对整个响应结构无脑按下标展平的方案,单独对可变的扩展属性数组做键值映射处理:
- 先把每个位置对象里的固定基础字段和
ExtendedAttributeValues数组拆分,固定字段沿用原有展平逻辑处理 - 遍历每个位置的扩展属性数组,提取
ColumnIdentifier中@符号前的内容作为列名,对应的Value作为该列的行值,生成键值对 - 合并固定字段和扩展属性的键值对,最后统一转为DataFrame,缺失的属性会由pandas自动填充为空值,完全匹配预期的宽表结构
实现代码
import pandas as pd # 原有接口拉取逻辑保持不变 locationDescriptions = timeseries.publish.get('/GetLocationDescriptionList')['LocationDescriptions'] locations = timeseries.provisioning.send_batch_requests('/locations/{Id}', [{'LocationUniqueId': loc['UniqueId']} for loc in locationDescriptions]) processed_rows = [] for loc in locations: # 拆分固定字段和需要单独处理的扩展属性数组 loc_copy = loc.copy() ext_attributes = loc_copy.pop('ExtendedAttributeValues', []) # 展平除扩展属性外的所有固定基础字段 flat_base_row = flatten(loc_copy) # 如果原有flatten函数不可用,可替换为pandas内置方法: # flat_base_row = pd.json_normalize(loc_copy).iloc[0].to_dict() # 遍历扩展属性,按标识生成列值映射 for attr in ext_attributes: # 提取@符号前的纯属性名,例如将COUNTY@LOCATION_EXTENSION处理为COUNTY col_name = attr['ColumnIdentifier'].split('@')[0] flat_base_row[col_name] = attr['Value'] processed_rows.append(flat_base_row) # 生成最终规整宽表,缺失属性自动补空 df_final = pd.DataFrame(processed_rows)
补充说明
- 该方案不依赖扩展属性的返回顺序、返回数量,API后续再增减扩展字段也不需要修改代码,会自动适配新增列
- 如果不需要保留位置基础信息(如位置ID、名称等固定字段),只需要扩展属性宽表,将
flat_base_row初始化为空字典即可 - 如果需要过滤不需要的扩展属性,在遍历
ext_attributes时加判断条件筛选即可
内容的提问来源于stack exchange,提问作者Mr. Geologist
相关产品推荐
相关产品推荐

