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

Python如何提取列表内JSON数据并展平为列保留asin字段

问题原因

你触发AttributeError: 'list' object has no attribute 'values'的核心原因是pd.json_normalize要求输入为「元素是单条待展平字典/JSON对象」的可迭代结构,你直接传入df['salesMetricsByAsin']时,Series的每个单元格本身是存储了多条指标的列表,pandas会尝试把传入的Series整体当作类字典结构读取values属性,列表没有该属性就会报错。

解决方案

两种常用实现方式,按需选择即可:

方法1:分步炸开列表再展平(逻辑直观易调试)

先把单元格内存储的列表拆成单行单条记录,再做JSON展平,最后拼接关联字段。

# 1. 将salesMetricsByAsin列的嵌套列表拆分为独立行,保留asin、sellingProgramName等关联字段
df_exploded = df.explode('salesMetricsByAsin', ignore_index=True)

# 2. 对拆分后的单条JSON指标做展平
metrics_cols = pd.json_normalize(df_exploded['salesMetricsByAsin'], errors='ignore')

# 3. 拼接关联字段和展平后的指标列,得到最终表
final_df = pd.concat(
    [df_exploded[['asin', 'sellingProgramName']].reset_index(drop=True), metrics_cols],
    axis=1
)

如果shippedRevenue、shippedCOGS这类指标本身还嵌套了金额、币种字段,json_normalize会自动按层级拆分为shippedRevenue.amount、shippedRevenue.currencyCode这类独立列,无需额外处理。

方法2:读取时一次性完成两层展平(性能更优,适合大数据量)

第一次调用json_normalize时就配置两层记录路径,通过meta参数指定需要保留的上层关联字段,省去中间DataFrame处理步骤:

final_df = pd.json_normalize(
    data=j,
    # 按嵌套层级指定两层记录路径:先取项目维度销售数据,再取ASIN下按日期存储的指标列表
    record_path=[
        'salesMetricsByProgram',
        'salesMetricsByAsin'
    ],
    # 指定需要保留的上层关联字段,嵌套字段要按层级写成列表格式
    meta=[
        'sellingProgramName',
        ['salesMetricsByProgram', 'asin']
    ],
    errors='ignore'
)

# 重命名带层级前缀的ASIN列
final_df = final_df.rename(columns={'salesMetricsByProgram.asin': 'asin'})
注意事项
  • 如果存在部分ASIN无对应销售指标(salesMetricsByAsin为空列表/空值),explode处理后对应行会自动填充为空值,可按需选择删除空行或保留。
  • 用方法2时,meta参数里嵌套在上层路径下的字段必须按嵌套顺序写为列表格式,否则会出现字段找不到的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.15 16:16:00