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

如何在Pandas的groupby().transform()中排除单个行?

实现分组内n-1个值的平均值计算

嘿,这个需求我做数据分析时也碰到过!你要的不是整个分组的平均值,而是排除当前行后,同组剩余n-1个值的均值,其实不用写复杂循环,用Pandas的分组变换就能高效实现。

核心思路

对于每个分组来说:

  • 先算出整个分组的总和(group_sum)
  • 再算出分组的总行数(group_size)
  • 当前行的n-1均值 = (分组总和 - 当前行的值) / (分组行数 - 1)

这个方法是向量化操作,比逐行循环过滤再求均值快得多,尤其适合大数据集。

代码实现(结合你的示例数据)

先补全示例数据,再一步步计算:

import pandas as pd

# 补全示例数据
list_of_tuples = [
    ('A', 3, 4.5), ('A', 2, 4.75), ('A', 5, 4), ('A', 4, 4.25), ('A', 7, 3.5),
    ('B', 6, 6.75), ('B', 9, 6), ('B', 8, 6.25), ('B', 7, 6.5)
]
df = pd.DataFrame(list_of_tuples, columns=['GROUP', 'VALUE', 'EXPECTED_RESULT'])

# 1. 计算每个分组的总和和行数
group_sum = df.groupby('GROUP')['VALUE'].transform('sum')
group_size = df.groupby('GROUP')['VALUE'].transform('size')

# 2. 计算n-1均值
df['CALCULATED_RESULT'] = (group_sum - df['VALUE']) / (group_size - 1)

# 查看结果,和期望输出对比
print(df[['GROUP', 'VALUE', 'EXPECTED_RESULT', 'CALCULATED_RESULT']])

运行后你会看到CALCULATED_RESULT和EXPECTED_RESULT完全匹配,比如A组第一个值3对应的均值是(3+2+5+4+7 - 3)/(5-1) = 18/4 = 4.5,和示例一致。

处理边界情况

如果数据里存在只有1行的分组,group_size - 1会等于0,计算会出现NaN。你可以根据需求处理:

# 方法1:保留NaN(默认行为)
# 方法2:填充为0或者其他值
df['CALCULATED_RESULT'] = (group_sum - df['VALUE']) / (group_size - 1).replace(0, 1)  # 避免除零,也可以用fillna(0)

内容的提问来源于stack exchange,提问作者Phil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:52:00