如何用Pandas按Release列分组并生成自定义汇总格式?
DataFrame分组求和并自定义格式展示解决方案
需求
对给定的DataFrame按Release列分组,对Pass和Fail列的值求和,并以[Pass: 总和, Fail: 总和]的自定义格式展示结果。
原始DataFrame
| Release | Pass | Fail | Total |
|---|---|---|---|
| release_a | 10 | 20 | 30 |
| release_a | 5 | 45 | 50 |
| release_a | 5 | 23 | 28 |
| release_a | 20 | 67 | 87 |
| release_a | 87 | 11 | 98 |
| release_b | 2 | 5 | 7 |
| release_b | 10 | 45 | 55 |
| release_b | 64 | 33 | 97 |
| release_c | 3 | 15 | 18 |
| release_c | 104 | 89 | 193 |
| release_c | 98 | 87 | 185 |
期望输出(注:原期望中release_a数值有误,已修正)
| Release | Summary |
|---|---|
| release_a | [Pass: 127, Fail: 166] |
| release_b | [Pass: 76, Fail: 83] |
| release_c | [Pass: 205, Fail: 191] |
错误代码分析
- 第一段代码
df.groupby(['Release Name'],as_index=False).agg({'Pass': lambda x: x.to_numpy().tolist()}):仅将分组后的Pass值转为列表,未执行求和操作,不符合需求。 - 第二段代码
df['Release Name'].map(df.value_counts('Pass')):value_counts是统计Pass值的出现频次,并非分组求和,逻辑完全错误。
正确解决方案代码
import pandas as pd # 构造原始DataFrame data = { 'Release': ['release_a']*5 + ['release_b']*3 + ['release_c']*3, 'Pass': [10,5,5,20,87,2,10,64,3,104,98], 'Fail': [20,45,23,67,11,5,45,33,15,89,87], 'Total': [30,50,28,87,98,7,55,97,18,193,185] } df = pd.DataFrame(data) # 按Release分组,对Pass和Fail列求和 grouped_sum = df.groupby('Release', as_index=False)[['Pass', 'Fail']].sum() # 生成自定义格式的Summary列 grouped_sum['Summary'] = grouped_sum.apply( lambda row: f"[Pass: {row['Pass']}, Fail: {row['Fail']}]", axis=1 ) # 保留需要的列并输出 final_df = grouped_sum[['Release', 'Summary']] print(final_df)
执行后输出:
Release Summary 0 release_a [Pass: 127, Fail: 166] 1 release_b [Pass: 76, Fail: 83] 2 release_c [Pass: 205, Fail: 191]
代码说明
- 分组求和:通过
groupby('Release')按版本分组,指定['Pass', 'Fail']列后调用sum(),直接得到每个版本的两列总和,as_index=False确保Release作为普通列保留。 - 构造自定义格式:使用
apply逐行处理分组后的DataFrame,通过字符串格式化将Pass和Fail的数值拼接成需求指定的格式。 - 整理输出:筛选出
Release和Summary两列,得到最终结果。
内容的提问来源于stack exchange,提问作者Anupkumar Kasi
相关产品推荐
相关产品推荐

