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

Pandas如何按另一列单个条目计算计数归一化值,得到各分类占比

方案1:修改crosstab的归一化参数

你之前使用normalize=True计算的是全局占比,改成normalize='columns'即可实现按Subject分组的组内占比,还可以直接补全你需要的所有预测值维度:

import pandas as pd
# 可先把长列名改短方便操作,也可以保留原名
df.columns = ['pred', 'subject']
# 生成按学科分组的占比
res = pd.crosstab(df['pred'], df['subject'], normalize='columns')
# 补全你指定的所有预测值[0,1,2,3,4,'NONE'],不存在的取值自动补0
all_pred_vals = [0,1,2,3,4,'NONE']
res = res.reindex(all_pred_vals, fill_value=0)
# 转成百分比并保留两位小数,和你之前循环输出格式一致
res = res.applymap(lambda x: f"{round(x*100,2)}%")
print(res)

方案2:用groupby + value_counts实现

逻辑更直观,直接按学科分组后统计每个预测值的占比:

res = df.groupby('subject')['pred'].value_counts(normalize=True)\
        .unstack(fill_value=0)\
        .reindex([0,1,2,3,4,'NONE'], axis=1, fill_value=0)\
        .applymap(lambda x: f"{round(x*100,2)}%")
print(res.T) # 转置后和你之前循环输出的结构完全一致

如果需要逐学科打印结果,只需要遍历结果列即可:

for sub in res.columns:
    print(f"Results for: {sub}\n")
    print(res[sub].to_string())
    print("-"*50,'\n')

两种方案都是pandas原生向量化运算,不需要手动写Python层循环,执行效率远高于自定义循环,数据量越大优势越明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:06:02