如何将多层嵌套字典转换为Pandas DataFrame?
多层嵌套字典转Pandas DataFrame的正确方法
问题背景
尝试将多层嵌套字典转成Pandas DataFrame时,先后遇到两个问题:
- 使用
pd.DataFrame.from_dict(nested_dict, orient="index")后,一级键(邮编)成为行索引,且列中仍保留子字典结构; - 使用
pd.json_normalize(nested_dict, max_level=1)后,得到仅1行、289114列的异常结果。
原字典结构示例:
{ '00501': { 'Saturday': {'data1': 'DATA1-1', 'data2': ''}, 'Sunday': {'data1': '', 'data2': ''}, # 其他星期数据 }, '00544': { 'Saturday': {'data1': 'DATA1-1', 'data2': ''}, 'Sunday': {'data1': '', 'data2': ''}, # 其他星期数据 }, # 更多邮编数据 }
解决方案
方法一:遍历构造数据后展开嵌套
通过遍历字典提取邮编,将其与对应星期数据合并,再逐个展开子字典列:
import pandas as pd # 构造包含邮编的基础数据列表 data_list = [] for zip_code, weekly_data in nested_dict.items(): daily_data = {'zip_code': zip_code, **weekly_data} data_list.append(daily_data) # 转成初始DataFrame df = pd.DataFrame(data_list) # 展开每个星期几的子字典列 week_cols = ['Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] for col in week_cols: # 展开子字典 normalized_col = pd.json_normalize(df[col]) # 为展开的列添加前缀,避免列名重复 normalized_col.columns = [f"{col}_{name}" for name in normalized_col.columns] # 合并回原DataFrame并删除原嵌套列 df = pd.concat([df.drop(col, axis=1), normalized_col], axis=1)
方法二:调整结构后直接用json_normalize
重新构造输入数据结构,让每个条目包含邮编和完整星期数据,再一次性展开所有嵌套:
import pandas as pd # 重构数据结构,将邮编作为每个条目的键值对 structured_data = [ {'zip_code': zip_code, **weekly_data} for zip_code, weekly_data in nested_dict.items() ] # 一次性展开所有嵌套层级 df = pd.json_normalize(structured_data)
最终效果
两种方法都会生成包含zip_code列,以及Saturday_data1、Saturday_data2、Sunday_data1等展开列的DataFrame,所有嵌套数据都被平铺为普通列,每个行对应一个邮编的完整数据。
内容的提问来源于stack exchange,提问作者HuLu ViCa
相关产品推荐
相关产品推荐

