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

Python:JSON转Excel时索引越界问题求助

解决pd.json_normalize合并时的索引越界错误

问题场景

将Shopify产品JSON数据转换为Excel时,仅归一化并合并variants和images两类嵌套数据时触发报错:

index 20 is out of bounds for axis 0 with size 19

但归一化三类数据时无此问题,原代码如下:

def get_data(link :str):
  resp = requests.get(link) #reading link
  txt = resp.json()
  data = pd.DataFrame(txt['products']) #data
  return txt

def main():
  #get json data from link
  json = get_data(link = 'https://0f91c5da166bc1b5a70cce01e1f0370c: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@shopeclat.myshopify.com/admin/api/2022-07/products.json')

  v = pd.json_normalize(json['products'], record_path =['variants'],meta=['id','title','body_html', 'vendor','product_type','created_at','updated_at','status','image','tags'],record_prefix='varients_')

  i = pd.json_normalize(json['products'], record_path =['images'],meta=['id','title','body_html', 'vendor','product_type','created_at','updated_at','status','image','tags'],record_prefix='images_')

  #merging all three dataset on id
  df = [v,i]
  final_df = reduce(lambda  left,right: pd.merge(left,right,on=['id'],
                                            how='outer'), df)

  print("Exporting csv files ....")
  final_df.to_csv('Bound.csv',index = False)
  
if __name__ == '__main__':
    main()

错误原因

  1. 重复meta列冲突:两个归一化DataFrame(v和i)都包含完全相同的顶层meta字段(如title、body_html、image等),合并时这些字段会被自动添加_x/_y后缀,导致数据结构冗余,且pandas处理嵌套类型字段(如image字典对象)时出现索引对齐异常。
  2. 冗余代码干扰:get_data函数中未使用的data变量无意义,且归一化时重复保留非关联字段,加剧了合并逻辑的复杂度。

解决方案

步骤1:拆分数据结构

将数据拆分为三类,避免重复字段:

  • 基础产品信息表:仅保留产品顶层非嵌套字段
  • 变体/图片信息表:仅保留对应嵌套字段+关联用的id

步骤2:修改后的代码

import requests
import pandas as pd
from functools import reduce

def get_data(link :str):
    resp = requests.get(link)
    return resp.json()

def main():
    # 获取JSON数据
    json_data = get_data(link='https://0f91c5da166bc1b5a70cce01e1f0370c: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@shopeclat.myshopify.com/admin/api/2022-07/products.json')
    
    # 1. 归一化变体数据:仅保留变体字段+产品ID
    variants_df = pd.json_normalize(
        json_data['products'],
        record_path=['variants'],
        meta=['id'],
        record_prefix='variants_'
    )
    
    # 2. 归一化图片数据:仅保留图片字段+产品ID
    images_df = pd.json_normalize(
        json_data['products'],
        record_path=['images'],
        meta=['id'],
        record_prefix='images_'
    )
    
    # 3. 提取产品基础信息(非嵌套字段)
    base_df = pd.json_normalize(
        json_data['products'],
        meta=['id', 'title', 'body_html', 'vendor', 'product_type', 'created_at', 'updated_at', 'status', 'tags']
    )
    
    # 4. 按产品ID合并所有表
    dfs_to_merge = [base_df, variants_df, images_df]
    final_df = reduce(lambda left, right: pd.merge(left, right, on='id', how='outer'), dfs_to_merge)
    
    print("Exporting csv files ....")
    final_df.to_csv('Bound.csv', index=False)
  
if __name__ == '__main__':
    main()

关键优化点

  • 移除冗余的data变量,简化get_data函数
  • 归一化时仅保留关联必需的id作为meta字段,避免重复列
  • 单独提取基础产品信息,确保合并后数据结构清晰
  • 合并时使用outer join保留所有产品、变体和图片数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:15:42