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

如何将value_counts得到的多级索引Series转为DataFrame

多级索引考试占比统计结果转DataFrame实现

场景说明

按学校、班级维度分析学生考试通过占比时,如下代码运行后输出为带三级(school、class、passed_or_not)索引的Series类型,无法直接开展后续结构化分析,需要转换为标准DataFrame格式:

df.groupby(["school","class"]).passed_or_not.value_counts(normalize=True)*100

转换方案

根据需要的表结构选择对应写法即可:

  • 宽表格式(每行对应1个班级,通过、未通过占比各为单独列,日常分析最常用)
    调用unstack()将最后一级passed_or_not索引转为DataFrame列,再重置行索引为普通字段即可:
    rate_df = (
        df.groupby(["school", "class"])
        .passed_or_not.value_counts(normalize=True)
        .mul(100)
        .unstack(fill_value=0) # fill_value=0用于填充无对应状态的班级占比,避免空值
        # 按passed_or_not字段的实际取值重命名列,比如字段取值是1/0就把键替换为1、0
        .rename(columns={True: "pass_rate(%)", False: "fail_rate(%)"})
        .reset_index()
    )
    
  • 长表格式(每行对应1个学校+班级+是否通过状态的单条占比记录)
    直接用to_frame()给统计结果设置列名,再重置索引即可:
    rate_df = (
        df.groupby(["school", "class"])
        .passed_or_not.value_counts(normalize=True)
        .mul(100)
        .to_frame("percentage(%)")
        .reset_index()
    )
    
  • 仅提取通过率单列(不需要展示未通过占比)
    先筛选出passed_or_not对应通过标记的记录,再转换为DataFrame即可,比如通过标记为True时:
    pass_rate_df = (
        df.groupby(["school", "class"])
        .passed_or_not.value_counts(normalize=True)
        .mul(100)
        .loc[:, :, True]
        .to_frame("pass_rate(%)")
        .reset_index()
    )
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 12:51:24