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

Pandas按多字段分组统计pass、fail及总记录数的实现问题

解决方案

有三种常用实现方式,你可以根据实际场景选择:

方法1:基于你现有pivot_table逻辑扩展

你现有的透视表已经拿到了pass和fail的计数,只需要额外计算每行的求和值,再调整列名和顺序即可:

# 生成基础透视表,aggfunc改用size比len更适配行数统计场景
pivot_df = pd.pivot_table(
    master_df, 
    index=['status', 'student', 'version'], 
    columns=['result'], 
    aggfunc='size', 
    fill_value=0
).reset_index()

# 新增总计数、重命名列、调整字段顺序
pivot_df['total_count'] = pivot_df['pass'] + pivot_df['fail']
pivot_df = pivot_df.rename(columns={'pass': 'pass_count', 'fail': 'fail_count'})
result_df = pivot_df[['student', 'version', 'pass_count', 'fail_count', 'status', 'total_count']]

方法2:groupby + value_counts 实现(更简洁)

如果你的result列只有pass、fail两个取值,用这个写法更高效:

result_df = (
    master_df.groupby(['status', 'student', 'version'])['result']
    .value_counts(dropna=False)
    .unstack(fill_value=0)
    .assign(total_count=lambda x: x['pass'] + x['fail'])
    .reset_index()
    .rename(columns={'pass': 'pass_count', 'fail': 'fail_count'})
    [['student', 'version', 'pass_count', 'fail_count', 'status', 'total_count']]
)

方法3:自定义聚合逻辑(兼容性最强)

如果result列还存在其他取值,不需要过滤直接统计的话,用自定义聚合的方式更准确:

result_df = (
    master_df.groupby(['status', 'student', 'version'], as_index=False)
    .agg(
        pass_count=('result', lambda x: (x == 'pass').sum()),
        fail_count=('result', lambda x: (x == 'fail').sum()),
        total_count=('result', 'size')
    )
    [['student', 'version', 'pass_count', 'fail_count', 'status', 'total_count']]
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:15:04