如何用json_normalize处理含多层嵌套列表的字典生成目标DataFrame
问题:用pandas的json_normalize转换多层嵌套字典为指定DataFrame
给定如下多层嵌套字典:
my_dict = {'policyId':['123'], 'Elements':[[{'id': '100', 'coverages': [{'id': 'ABC', 'premiums': {'var1': {}, 'var2': {}}, 'quoteDetails': [{'id': 'PRICE', 'tags': ['SOMETHING'], 'value': 150.0, 'modifiable': False}, {'id': 'DISCOUNT', 'tags': ['SOMETHING'], 'value': 10.0, 'modifiable': False}]}], 'mandatory': True, 'selected': True}, {'id': '101', 'coverages': [{'id': 'DEF', 'premiums': {'var1': {}, 'var2': {}}, 'quoteDetails': [{'id': 'PRICE', 'tags': ['SOMETHING'], 'value': 200.0, 'modifiable': False}, {'id': 'DISCOUNT', 'tags': ['SOMETHING'], 'value': 15.0, 'modifiable': False}]}], 'mandatory': True, 'selected': True} ]] }
需要将其转换为如下格式的DataFrame:
policyId coverages PRICE DISCOUNT 123 ABC 150.0 10.0 123 DEF 200.0 15.0
解决方案
由于字典存在多层嵌套列表(policyId、Elements、coverages、quoteDetails均为列表结构),需分步展开并整理:
步骤1:展平外层嵌套,关联policyId与Elements内容
import pandas as pd # 提取policyId并转为DataFrame df_policy = pd.DataFrame(my_dict['policyId'], columns=['policyId']) # 展平Elements的二维列表 elements_flat = [item for sublist in my_dict['Elements'] for item in sublist] # 将Elements内容转为DataFrame,与policyId合并(policyId对应所有Elements条目) df_elements = pd.DataFrame(elements_flat) df_merged = pd.concat([df_policy.loc[[0]] * len(df_elements), df_elements], axis=1)
步骤2:展开coverages列表,提取coverage ID
使用json_normalize展开coverages列,保留关联的policyId等字段:
df_coverages = pd.json_normalize(df_merged.to_dict('records'), record_path='coverages', meta=['policyId', 'id'], record_prefix='coverage_') # 重命名coverage_id为coverages,符合预期列名 df_coverages = df_coverages.rename(columns={'coverage_id': 'coverages'})
步骤3:展开quoteDetails并转换为宽表格式
先展开quoteDetails列表,再通过pivot将PRICE和DISCOUNT转为列:
# 展开quoteDetails字段 df_quotes = pd.json_normalize(df_coverages.to_dict('records'), record_path='coverage_quoteDetails', meta=['policyId', 'coverages']) # pivot转换为宽表,将id作为列名,value作为对应值 df_pivoted = df_quotes.pivot(index=['policyId', 'coverages'], columns='id', values='value').reset_index()
步骤4:调整列顺序(可选)
如果需要完全匹配预期的列顺序,使用reindex调整:
df_final = df_pivoted.reindex(columns=['policyId', 'coverages', 'PRICE', 'DISCOUNT']) print(df_final)
最终输出:
policyId coverages PRICE DISCOUNT 0 123 ABC 150.0 10.0 1 123 DEF 200.0 15.0
内容的提问来源于stack exchange,提问作者Rods2292
相关产品推荐
相关产品推荐

