如何将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
相关产品推荐
相关产品推荐

