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

