如何统计Pandas DataFrame中分数高于对应科目均值的行数
解决方案
最简实现
可以直接用groupby+apply完成需求,一行代码即可输出结果,且会自动保留所有科目(无人达标时计数为0):
result = df.groupby('Subject')['Score'].apply(lambda s: (s > s.mean()).sum()).reset_index(name='high_score_stu_num')
可读性更高的分步实现
如果需要调整逻辑或者查看中间过程,也可以用transform广播科目平均分后过滤统计:
# 1. 给每行添加对应科目的平均分字段 df_with_avg = df.assign(subject_avg = df.groupby('Subject')['Score'].transform('mean')) # 2. 过滤出分数高于科目平均分的行,按科目分组计数 result = df_with_avg[df_with_avg['Score'] > df_with_avg['subject_avg']].groupby('Subject', as_index=False).agg(high_score_stu_num=('Name', 'count'))
结果说明
用你给出的样例数据运行代码,会得到如下结果:
| Subject | high_score_stu_num |
|---|---|
| s1 | 1 |
| s2 | 2 |
和实际计算结果一致:s1平均分为92.5,仅Amy达标;s2平均分为87.5,Emma和Helen达标。
内容的提问来源于stack exchange,提问作者dorothyZhang
相关产品推荐
相关产品推荐

