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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:37:07