Pandas条件聚合:无需先过滤再关联的更简洁实现方案
实现方案
直接使用pandas的transform方法即可满足需求,该方法会将分组聚合的结果广播到对应分组的所有行,无需额外做过滤后关联的操作,原始数据可以完整保留。
代码实现
方案1:聚合结果直接回写到原表(保留所有原始行)
# 生成过滤条件掩码 filter_mask = df['rank'] <= 2 # 分组计算符合条件的行的最大值,直接写入原表新列 df[['score_max', 'label_max']] = df[filter_mask].groupby('trigger')[['score', 'label']].transform('max') # 若存在没有符合条件行的分组,可按需填充默认值,示例填充为0 # df[['score_max', 'label_max']] = df[['score_max', 'label_max']].fillna(0)
执行后原表所有原始字段不会被修改,新增的score_max、label_max为对应trigger分组下rank<=2行的最大值,同分组所有行的这两个新增字段值一致。
方案2:仅生成聚合汇总表,不修改原表
如果不需要将聚合结果关联回原始行,仅需要得到分组统计结果,可以直接在聚合函数中嵌入过滤逻辑:
agg_result = df.groupby('trigger').agg( score_max=('score', lambda x: x[df.loc[x.index, 'rank'] <= 2].max()), label_max=('label', lambda x: x[df.loc[x.index, 'rank'] <= 2].max()) )
该方案不需要提前对原表做过滤切片,聚合计算只会统计符合条件的行。
内容的提问来源于stack exchange,提问作者Georg Heiler
相关产品推荐
相关产品推荐

