Python如何计算groupby分组内排除当前行的指定列平均值
你原来的写法是直接对分组取整体均值,自然会包含当前行数据。可以用两种方式实现需求:
方法1:向量化计算(推荐,大数据量下性能优异)
核心逻辑是用分组总金额减去当前行金额,除以分组条数减1,完全避开循环,性能极高:
import numpy as np import pandas as pd # 计算每个id对应的总支付金额、支付记录数 df['group_pay_sum'] = df.groupby('id')['pay'].transform('sum') df['group_pay_cnt'] = df.groupby('id')['pay'].transform('count') # 计算排除当前行的平均支付金额,单条记录的分组结果会设为NaN df['other_pay_avg'] = (df['group_pay_sum'] - df['pay']) / (df['group_pay_cnt'] - 1) df['other_pay_avg'] = df['other_pay_avg'].replace([np.inf, -np.inf], np.nan) # 可选:删除计算用的中间列 df.drop(columns=['group_pay_sum', 'group_pay_cnt'], inplace=True)
方法2:apply自定义计算(适合小数据量、需要自定义逻辑场景)
如果后续需要加额外的过滤规则,可以用groupby+apply的写法,逻辑更直观,但数据量超过10万条时性能会明显下降:
def calc_avg_exclude_current(group: pd.Series): # 对分组内每一行,取除当前行外的所有值求均值 return group.apply(lambda x: group.drop(x.index).mean()) df['other_pay_avg'] = df.groupby('id')['pay'].apply(calc_avg_exclude_current)
内容的提问来源于stack exchange,提问作者Jacob2309
相关产品推荐
相关产品推荐

