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

如何用Pandas json_normalize完全展平嵌套字典生成DataFrame

解决嵌套字典完全展平为DataFrame的问题

当pd.json_normalize()无法自动展开嵌套列表字段时,你可以通过分步展开+关联合并的方式实现完全展平,具体步骤如下:

1. 准备基础DataFrame

先生成包含顶层字段的基础表,同时保留需要展开的列表字段:

import pandas as pd

# 生成基础表
base_df = pd.json_normalize(person_json)
# 定义需要展开的列表字段
list_fields = ['previousEmployments', 'disclosures', 'stateExamCategory', 'principalExamCategory', 'productExamCategory']

# 添加临时关联键(如果原数据没有唯一标识字段,用索引代替)
base_df['_temp_id'] = base_df.index

2. 逐个展开嵌套列表字段

对每个列表字段,先通过explode()将列表拆分为多行,再用json_normalize()展开列表内的嵌套字典,最后和基础表关联:

以previousEmployments为例:

# 拆分previousEmployments列表为多行
pe_expanded = base_df.explode('previousEmployments').reset_index(drop=True)
# 展开列表内的嵌套字典,并和原有字段合并
pe_expanded = pd.concat(
    [pe_expanded.drop('previousEmployments', axis=1), 
     pd.json_normalize(pe_expanded['previousEmployments'])],
    axis=1
)

重复上述逻辑处理其他列表字段,比如disclosures:

# 处理disclosures字段
discl_expanded = pe_expanded.explode('disclosures').reset_index(drop=True)
discl_expanded = pd.concat(
    [discl_expanded.drop('disclosures', axis=1), 
     pd.json_normalize(discl_expanded['disclosures'])],
    axis=1
)

3. 清理临时字段

所有字段展开完成后,删除临时关联键:

final_df = discl_expanded.drop('_temp_id', axis=1)

注意事项

  • 如果多个列表字段是独立的一对多关系,展开后会产生笛卡尔积(比如一个人有2段工作经历+2条披露信息,最终会生成4行数据),这是正常的关系型数据展开逻辑。
  • 如果列表字段内还有更深层次的嵌套字典,pd.json_normalize()会自动识别并展平为单独列。
  • 如果原数据中有唯一标识字段(比如personId),建议用该字段代替临时索引作为关联键,避免索引混乱。

内容的提问来源于stack exchange,提问作者SChatcha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:52:50