嵌套JSON转DataFrame遇TypeError:如何正确展平含列表的JSON?
解决多层嵌套JSON转Pandas DataFrame的TypeError问题
错误原因分析
你触发的TypeError: list indices must be integers or slices, not str是因为rawData['results']是列表类型,直接用rawData['results']['submissions']索引完全错误——列表只能用整数/切片定位元素,不能用字符串字段名。
正确的展平方法
假设你的rawData['results']结构是类似这样的列表(每个元素包含嵌套列表和元数据字段):
[ { "application_name": "App1", "sponsor_name": "SponsorA", "submissions": [ {"submission_id": "S1", "status": "approved"}, {"submission_id": "S2", "status": "pending"} ] }, # 更多类似对象... ]
1. 直接展平submissions列
基于rawData['results']列表,用pd.json_normalize指定要展开的嵌套路径和保留的元数据:
import pandas as pd # 展平submissions列表,同时保留上层的application_name和sponsor_name df_submissions = pd.json_normalize( data=rawData['results'], record_path='submissions', # 指定要展开的嵌套列表字段名 meta=['application_name', 'sponsor_name'] # 指定需要保留的顶级字段 )
2. 处理更深层嵌套(如submissions下的products)
如果submissions里还有products这类嵌套列表,用层级列表指定record_path,同时调整meta保留中间层级的字段:
# 展平submissions下的products列表,保留多层元数据 df_products = pd.json_normalize( data=rawData['results'], record_path=['submissions', 'products'], # 嵌套路径:先取submissions,再取其中的products meta=[ 'application_name', 'sponsor_name', ['submissions', 'submission_id'] # 保留submissions层级的submission_id ] )
3. 基于初始部分展平的DataFrame处理
如果已经生成了初始的df_initial = pd.json_normalize(rawData['results']),也可以通过explode先展开submissions列,再对嵌套字典归一化:
# 先展开submissions列的列表 df_exploded = df_initial.explode('submissions').reset_index(drop=True) # 归一化submissions字段,合并原有的元数据字段 df_submissions = pd.concat([ df_exploded.drop('submissions', axis=1), pd.json_normalize(df_exploded['submissions']) ], axis=1)
关键注意点
pd.json_normalize的data参数必须是可迭代对象(如列表),每个元素是包含嵌套结构的字典。record_path可以是字符串(单层级嵌套)或列表(多层级嵌套),指向要展开的列表字段。meta参数用于指定需要保留的非列表字段,多层级字段同样用列表表示(如['submissions', 'submission_id'])。
内容的提问来源于stack exchange,提问作者Nano
相关产品推荐
相关产品推荐

