如何将三层嵌套字典转为指定多级表头的Pandas DataFrame
三层嵌套字典转指定多级表头Pandas DataFrame方案
直接用以下代码即可生成完全匹配要求格式的DataFrame:
import pandas as pd # 原始三层嵌套数据,注意不要用dict做变量名,会覆盖Python内置类型 source_data = {'A1' : {'B1' : {'Average' : 0 , 'Max' : 0, 'Min' : 0}, 'B2' : {'Average' : 0 , 'Max' : 0, 'Min' : 0}, 'B3' : {'Average' : 0 , 'Max' : 0, 'Min' : 0}}, 'A2' : {'B1' : {'Average' : 0 , 'Max' : 0, 'Min' : 0}, 'B2' : {'Average' : 0 , 'Max' : 0, 'Min' : 0}, 'B3' : {'Average' : 0 , 'Max' : 0, 'Min' : 0}}} # 第一步:以最外层字典键为行索引生成初始DataFrame df = pd.DataFrame.from_dict(source_data, orient='index') # 第二步:拆分单元格内的字典为二级列结构 df = df.apply(pd.Series).stack().unstack(level=-1) # 第三步:交换列层级,把B1/B2/B3调整为第一级表头 df.columns = df.columns.swaplevel(0, 1) # 第四步:排序固定列顺序,避免表头乱序 df = df.sort_index(axis=1, level=[0, 1]) # 第五步:设置行索引名称为Region df.index.name = 'Region'
运行后打印df可得到完全匹配预期的结果:
B1 B2 B3 Average Max Min Average Max Min Average Max Min Region A1 0 0 0 0 0 0 0 0 0 A2 0 0 0 0 0 0 0 0 0
关键实现说明
- 直接调用
pd.DataFrame(source_data)会默认把最外层A1/A2识别为列,和需求的行索引要求相反,必须指定orient='index'参数 - 初始转换后生成的二级列表头顺序是「统计指标-B类标签」,和需求的顺序相反,用
swaplevel(0,1)即可快速交换两级表头的位置 - 最后调用
sort_index是为了固定列顺序,保证B1/B2/B3按序排列,每个B分组下的Average/Max/Min字段也保持统一顺序,不会出现乱序问题
内容的提问来源于stack exchange,提问作者Galo Torres Sevilla
相关产品推荐
相关产品推荐

