如何用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
相关产品推荐
相关产品推荐

