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

