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

