Python中嵌套JSON规范化及转换为Pandas DataFrame的方法
解决方法
首先纠正你代码里的两处基础问题:
- 变量名拼写错误:
jsob_obj应该是json_obj - 键名大小写不匹配:JSON里的键是
Retaillocations,你调用时写的retailLocations,大小写不一致会导致找不到对应字段 - 核心逻辑偏差:你要生成单条记录,不能用
record_path去展开嵌套列表,否则会把每个subLocation拆成单独行,不符合需求
方案1:保留嵌套列表结构,生成单条记录
如果只是要将整个JSON转换为包含嵌套列表的单条DataFrame记录,直接使用pd.json_normalize默认参数即可:
import json import pandas as pd # 假设inputData是你的JSON字符串 json_obj = json.loads(inputData) df = pd.json_normalize(json_obj)
生成的DataFrame会有一行数据,其中Retaillocations.subLocation和distributionLocations.subLocation列会存储对应的列表数据。
方案2:将嵌套列表转为字符串(便于查看和统计)
如果不想保留列表结构,可将每个subLocation的地址信息拼接成字符串,预处理后再转DataFrame:
import json import pandas as pd json_obj = json.loads(inputData) # 遍历处理每个数据条目 for item in json_obj: # 拼接零售地址为字符串 item['retail_addresses'] = '; '.join([f"{addr['address']} ({addr['district']})" for addr in item['Retaillocations']['subLocation']]) # 拼接配送地址为字符串 item['distribution_addresses'] = '; '.join([f"{addr['address']} ({addr['district']})" for addr in item['distributionLocations']['subLocation']]) # 删除原嵌套字段 del item['Retaillocations'] del item['distributionLocations'] df = pd.DataFrame(json_obj)
最终生成的DataFrame包含id、city、retail_addresses、distribution_addresses四列,每行是完整的单条记录。
原代码报错原因解析
你指定record_path='retailLocations'时,一是键名拼写大小写不匹配,二是Retaillocations是字典类型,而record_path需要指向列表类型的键,因此会抛出“list indices must be integers or slices, not str”错误。如果是想展开零售地址为多行记录,才需要指定record_path=['Retaillocations', 'subLocation']并配合meta参数保留id、city,但这与你要单条记录的需求不符。
内容的提问来源于stack exchange,提问作者324
相关产品推荐
相关产品推荐

