DataFrame按A列分组:指定A值求和B列、全量求和C列的实现问题
解决方案
方法一:分步骤处理(清晰高效)
先对所有分组计算C列总和,再单独处理符合条件的B列求和,最后合并结果:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'A': ['foo', 'foo', 'bar', 'bar', 'else', 'else'], 'B': [1, 3, 3, 3, 4, 2], 'C': [2, 3, 4, 4, 5, 1] }) # 计算所有分组的C列求和 result = df.groupby('A', as_index=False)['C'].sum() # 计算仅foo/bar分组的B列求和,合并到结果中 b_sum = df[df['A'].isin(['foo', 'bar'])].groupby('A', as_index=False)['B'].sum() result = result.merge(b_sum, on='A', how='left') # 调整列顺序并将空值转为空字符串(匹配预期格式) result = result[['A', 'B', 'C']] result['B'] = result['B'].fillna('') print(result)
输出结果:
A B C 0 bar 6 8 1 else 6 2 foo 4 5
方法二:agg内直接条件判断(更简洁)
利用分组对象的name属性判断当前分组是否为目标值,直接在agg中完成计算:
import pandas as pd df = pd.DataFrame({ 'A': ['foo', 'foo', 'bar', 'bar', 'else', 'else'], 'B': [1, 3, 3, 3, 4, 2], 'C': [2, 3, 4, 4, 5, 1] }) result = df.groupby('A', as_index=False).agg( B=('B', lambda x: x.sum() if x.name in ['foo', 'bar'] else ''), C=('C', 'sum') ) print(result)
输出结果和预期完全一致。
原代码的问题分析
- 语法错误:
agg的字典格式错误,逗号位置混乱且缺少闭合括号;sum_hours调用时多传了参数。 - 逻辑错误:自定义函数
sum_hours接收的是分组后的B列Series,不是完整DataFrame,所以df['A']会直接报错——此时x是B列数据,不存在'A'列。 - 效率问题:自定义lambda+外部函数的写法,无法利用Pandas的向量化优化,运行速度远慢于内置方法。
内容的提问来源于stack exchange,提问作者zsh_18
相关产品推荐
相关产品推荐

