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

