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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:15:03