如何用嵌套字典创建Pandas多层列DataFrame?分析可行性咨询
实现多层列Pandas DataFrame及分组运算方案
一、正确创建多层列DataFrame
假设你的嵌套字典结构类似这样(以年级-科目-成绩等级为例):
data = { '高一': { '物理': {'及格': 30, '不及格': 10}, '数学': {'及格': 25, '不及格': 15} }, '高二': { '物理': {'及格': 40, '不及格': 5}, '数学': {'及格': 35, '不及格': 10} } }
直接用pd.DataFrame.from_dict(data)会得到以最外层键为行索引的结果,不符合多层列需求。你可以通过以下两种方式实现预期结构:
方法1:字典推导式+from_dict直接生成
import pandas as pd df = pd.DataFrame.from_dict({(level1, level2): vals for level1, subdict in data.items() for level2, vals in subdict.items()}, orient='columns')
通过把嵌套层级打包成元组作为列名,直接生成带MultiIndex的多层列DataFrame。
方法2:先展开再转换列索引
df = pd.DataFrame.from_dict(data, orient='index').stack().apply(pd.Series).unstack([1,2]) df.columns = df.columns.droplevel(0) # 移除多余的顶层索引
先将嵌套结构展开,再通过unstack把层级转换为列的多层索引。
最终生成的DataFrame列结构如下:
| 物理 | 数学 | |||
|---|---|---|---|---|
| 及格 | 不及格 | 及格 | 不及格 | |
| 高一 | 30 | 10 | 25 | 15 |
| 高二 | 40 | 5 | 35 | 10 |
二、多层列结构与分组运算的适配性
多层列结构非常适合分组运算,比如计算物理科目的及格率:
# 提取物理列的所有数据 physics_data = df['物理'] # 计算每个年级物理及格率 physics_pass_rate = physics_data['及格'] / (physics_data['及格'] + physics_data['不及格']) * 100
也可以通过列层级批量计算所有科目的百分比:
# 按科目层级分组,计算每个科目的及格率 subject_pass_rates = df.groupby(level=0, axis=1).apply( lambda x: x['及格'] / x.sum(axis=1) * 100 )
多层列的层级索引可直接用于groupby的level参数,无需额外整理数据,逻辑清晰。
三、更优方案建议
- 保留多层列:如果你的分析以「年级-科目-指标」的层级逻辑为主,且经常需要跨年级对比同一科目、跨科目对比同一指标,多层列结构会让代码更简洁,可读性更强。
- 转换为长格式:如果后续需要做可视化(比如用Seaborn绘制分组图表),可以把多层列转成行索引,变成长格式:
long_df = df.stack([0,1]).reset_index(name='人数') long_df.columns = ['年级', '科目', '成绩等级', '人数']
长格式更适配大多数可视化库的输入要求,也方便做更灵活的分组聚合。
内容的提问来源于stack exchange,提问作者desert_ranger
相关产品推荐
相关产品推荐

