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

如何在Pandas中无需apply实现groupby+条件+求和操作?

不使用apply实现分组条件求和

原始DataFrame

id  value  is_mapping
0   1      1           1
1   1      1           1
2   1      1           0
3   2      1           0
4   2      1           0
5   2      1           0
6   3      1           1
7   3      1           1
8   3      1           1

需求

按id分组,仅对is_mapping == 1的记录求和value字段,要求保留所有id(无符合条件记录的id求和结果为0)。

期望结果

id  sum_result
0   1           2
1   2           0
2   3           3

实现方案(无需apply)

完全可以不用apply实现,推荐两种高效简洁的方式:

方法1:列运算转换后分组求和

先通过列运算将is_mapping == 0的记录的value置为0,再按id分组求和:

import pandas as pd

# 构造原始数据
df = pd.DataFrame({
    'id': [1,1,1,2,2,2,3,3,3],
    'value': [1,1,1,1,1,1,1,1,1],
    'is_mapping': [1,1,0,0,0,0,1,1,1]
})

# 核心逻辑
result = df.assign(calculated_value=df['value'] * df['is_mapping'])\
           .groupby('id', as_index=False)['calculated_value'].sum()\
           .rename(columns={'calculated_value': 'sum_result'})

说明:value * is_mapping会自动将is_mapping=0的行的数值转为0,分组求和时自然保留所有id,无符合条件记录的id求和结果为0,完全符合需求。

方法2:分组聚合时指定条件求和

利用groupby.agg结合索引匹配实现条件求和,无需apply:

result = df.groupby('id', as_index=False).agg(
    sum_result=('value', lambda x: x[df.loc[x.index, 'is_mapping'] == 1].sum())
)

说明:这里的lambda是在聚合参数中使用,不属于apply方法范畴,同样能实现需求,不过方法1的可读性和执行效率更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:07:21