如何在Pandas中基于其他列条件编写自定义聚合函数
解决方案
没问题,我来帮你调整聚合函数,精准实现你要的按条件聚合需求!
核心思路是在每个分组的子DataFrame里,分别根据d列的阈值筛选行,再计算对应列的统计值:
Sum_a取分组内d < 250的行中a列的和,没有符合条件的行时sum会自动返回0,正好匹配你要的结果Mean_b取分组内d > 250的行中b列的均值
修改后的完整代码
import pandas as pd # 修正示例数据的c列值(加上引号,避免未定义变量错误) df = pd.DataFrame({ "a": [10,20,30,40], "b": [1,2,3,4], "c": ["c1","c1","c1","c2"], "d": [100,200,300,400] }) def my_agg91(x): # 按d的条件分别计算 sum_a = x[x['d'] < 250]['a'].sum() mean_b = x[x['d'] > 250]['b'].mean() # 返回指定索引的Series,确保列名对应 return pd.Series( {'Sum_a': sum_a, 'Mean_b': mean_b}, index=['Sum_a', 'Mean_b'] ) df2 = df.groupby(['c']).apply(my_agg91) print(df2)
运行结果
Sum_a Mean_b c c1 30.0 3.0 c2 0.0 4.0
代码说明
- 针对每个分组
x,用布尔索引x['d'] < 250筛选出符合条件的行,再对a列求和; - 同理用
x['d'] > 250筛选后对b列求均值; - 返回的Series指定了索引,保证分组后的结果列顺序和你要的一致;
- 当分组内没有符合条件的行时(比如c2中没有d<250的行),
sum()会返回0,完美匹配预期输出。
内容的提问来源于stack exchange,提问作者Chetanya Saxena
相关产品推荐
相关产品推荐

