You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用嵌套字典创建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列结构如下:

物理数学
及格不及格及格不及格
高一30102515
高二4053510

二、多层列结构与分组运算的适配性

多层列结构非常适合分组运算,比如计算物理科目的及格率:

# 提取物理列的所有数据
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参数,无需额外整理数据,逻辑清晰。

三、更优方案建议

  1. 保留多层列:如果你的分析以「年级-科目-指标」的层级逻辑为主,且经常需要跨年级对比同一科目、跨科目对比同一指标,多层列结构会让代码更简洁,可读性更强。
  2. 转换为长格式:如果后续需要做可视化(比如用Seaborn绘制分组图表),可以把多层列转成行索引,变成长格式:
long_df = df.stack([0,1]).reset_index(name='人数')
long_df.columns = ['年级', '科目', '成绩等级', '人数']

长格式更适配大多数可视化库的输入要求,也方便做更灵活的分组聚合。

内容的提问来源于stack exchange,提问作者desert_ranger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:07:21