如何将含嵌套字典的列表写入Pandas DataFrame多行及扩展场景处理
问题描述
原始需求
给定嵌套字典列表:
myDict = [{'First_Name': 'Jack', 'Last_Name': 'Smith', 'Job_Data': [{'Company': 'Amazon'}, {'Hire_Date': '2011-04-01', 'Company': 'Target'}]}, {'First_Name': 'Jill', 'Last_Name': 'Smith', 'Job_Data': [{'Hire_Date': '2009-11-16', 'Company': 'Sears'}, {'Hire_Date': '2011-04-01'}]}]
数据存在键重复、缺失的情况,需将所有数据展开为Pandas DataFrame的多行,目标输出:
First_Name Last_Name Hire_Date Company 0 Jack Smith NaN Amazon 1 Jack Smith 2011-04-01 Target 2 Jill Smith 2009-11-16 Sears 3 Jill Smith 2011-04-01 NaN
补充需求
当字典新增Dependent_data键后:
myDict = [{'First_Name': 'Jack', 'Last_Name': 'Smith', 'Job_Data': [{'Company': 'Amazon'}, {'Hire_Date': '2011-04-01', 'Company': 'Target'}], 'Dependent_data': [{'Dependent': 'Susan Smith'}, {'Dependent': 'Will Smith'}]}, {'First_Name': 'Jill', 'Last_Name': 'Smith', 'Job_Data': [{'Hire_Date': '2009-11-16', 'Company': 'Sears'}, {'Hire_Date': '2011-04-01'}]}]
需生成包含依赖数据的输出,期望结果:
First_Name Last_Name Hire_Date Company Dependent 0 Jack Smith NaN Amazon Susan Smith 1 Jack Smith 2011-04-01 Target Will Smith 2 Jill Smith 2009-11-16 Sears NaN 3 Jill Smith 2011-04-01 NaN NaN
解决方案
处理原始需求(无Dependent_data)
核心是展开嵌套的Job_Data列表,同时保留用户基础字段,用Pandas的explode+json_normalize实现:
import pandas as pd myDict = [{'First_Name': 'Jack', 'Last_Name': 'Smith', 'Job_Data': [{'Company': 'Amazon'}, {'Hire_Date': '2011-04-01', 'Company': 'Target'}]}, {'First_Name': 'Jill', 'Last_Name': 'Smith', 'Job_Data': [{'Hire_Date': '2009-11-16', 'Company': 'Sears'}, {'Hire_Date': '2011-04-01'}]}] # 转原始数据为DataFrame df = pd.DataFrame(myDict) # 展开Job_Data列表,每个元素占一行 df_exploded = df.explode('Job_Data', ignore_index=True) # 解析Job_Data嵌套字典为单独列,合并到原表 final_df = pd.concat([df_exploded.drop('Job_Data', axis=1), pd.json_normalize(df_exploded['Job_Data'])], axis=1) print(final_df)
运行后缺失字段自动填充NaN,得到目标输出。
处理补充需求(含Dependent_data)
需同时展开Job_Data和Dependent_data列表,对齐对应行,缺失数据填充NaN:
import pandas as pd myDict = [{'First_Name': 'Jack', 'Last_Name': 'Smith', 'Job_Data': [{'Company': 'Amazon'}, {'Hire_Date': '2011-04-01', 'Company': 'Target'}], 'Dependent_data': [{'Dependent': 'Susan Smith'}, {'Dependent': 'Will Smith'}]}, {'First_Name': 'Jill', 'Last_Name': 'Smith', 'Job_Data': [{'Hire_Date': '2009-11-16', 'Company': 'Sears'}, {'Hire_Date': '2011-04-01'}]}] # 转DataFrame,缺失Dependent_data的行填充空列表 df = pd.DataFrame(myDict).fillna({'Dependent_data': [[]]}) # 同时展开两个嵌套列表 df_exploded = df.explode(['Job_Data', 'Dependent_data'], ignore_index=True) # 解析Job_Data的嵌套字典 job_df = pd.json_normalize(df_exploded['Job_Data']) # 解析Dependent_data的嵌套字典,空列表自动转为NaN dependent_df = pd.json_normalize(df_exploded['Dependent_data']) # 合并所有列 final_df = pd.concat([df_exploded.drop(['Job_Data', 'Dependent_data'], axis=1), job_df, dependent_df], axis=1) print(final_df)
这段代码会完全匹配期望输出,自动对齐Jack的工作记录和家属数据,Jill的家属字段填充NaN。
内容的提问来源于stack exchange,提问作者Jeb
相关产品推荐
相关产品推荐

