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

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)

输出结果和预期完全一致。

原代码的问题分析

  1. 语法错误:agg的字典格式错误,逗号位置混乱且缺少闭合括号;sum_hours调用时多传了参数。
  2. 逻辑错误:自定义函数sum_hours接收的是分组后的B列Series,不是完整DataFrame,所以df['A']会直接报错——此时x是B列数据,不存在'A'列。
  3. 效率问题:自定义lambda+外部函数的写法,无法利用Pandas的向量化优化,运行速度远慢于内置方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:32:12