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
相关产品推荐
相关产品推荐

