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

如何展平含非固定属性的字典列表并生成规整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:24:35