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()
错误原因
- 重复meta列冲突:两个归一化DataFrame(
v和i)都包含完全相同的顶层meta字段(如title、body_html、image等),合并时这些字段会被自动添加_x/_y后缀,导致数据结构冗余,且pandas处理嵌套类型字段(如image字典对象)时出现索引对齐异常。 - 冗余代码干扰:
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
相关产品推荐
相关产品推荐

