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

使用pd.json_normalize遇路径错误,求含缺失Job_Data数据的归一化方案

解决JSON归一化时缺失record_path的问题

问题背景

原始字典数据:

myDict = [
    {'First_Name': 'Jack', 'Last_Name': 'Smith', 'Job_Data': [{'Company': 'Amazon'}, {'Hire_Date': '2011-04-01', 'Company': 'Target'}]}, 
    {'First_Name': 'Jill', 'Last_Name': 'Smith'}
]

期望得到的归一化DataFrame:

First_Name    Last_Name    Hire_Date     Company
0     Jack          Smith        NaN           Amazon  
1     Jack          Smith        2011-04-01    Target
2     Jill          Smith        NaN           NaN

使用pd.json_normalize(data=myDict, meta=['First_Name', 'Last_Name'], record_path='Job_Data')时,触发错误:If specifying a record_path, all elements of data should have the path,原因是部分数据对象不含Job_Data字段。

解决方案一:补全缺失的Job_Data字段

先遍历原始数据,给每个没有Job_Data的字典添加该字段,值设为[{}](空字典组成的列表,保证结构统一),再执行归一化:

import pandas as pd

# 补全缺失的Job_Data字段
for item in myDict:
    if 'Job_Data' not in item:
        item['Job_Data'] = [{}]

# 执行归一化
df = pd.json_normalize(data=myDict, meta=['First_Name', 'Last_Name'], record_path='Job_Data')
# 调整列顺序(可选,匹配期望格式)
df = df[['First_Name', 'Last_Name', 'Hire_Date', 'Company']]
print(df)

解决方案二:使用explode替代json_normalize

先将原始数据转为DataFrame,填充缺失的Job_Data为空列表,再展开列表,最后将字典列拆分为单独字段:

import pandas as pd

# 转为初始DataFrame
df_initial = pd.DataFrame(myDict)
# 填充缺失的Job_Data为空列表
df_initial['Job_Data'] = df_initial['Job_Data'].apply(lambda x: x if isinstance(x, list) else [{}])
# 展开Job_Data列表
df_exploded = df_initial.explode('Job_Data', ignore_index=True)
# 将Job_Data中的字典拆分为列
df_final = pd.concat([df_exploded.drop('Job_Data', axis=1), df_exploded['Job_Data'].apply(pd.Series)], axis=1)
# 调整列顺序
df_final = df_final[['First_Name', 'Last_Name', 'Hire_Date', 'Company']]
print(df_final)

两种方案都能得到目标格式的DataFrame,方案一直接适配json_normalize的要求,方案二更灵活,适合处理复杂嵌套结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:01:20