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

如何高效实现Pandas中排除指定分组后的均值计算?

高效计算排除单年龄组后的整体平均阅读能力

当然有更高效的实现方式!咱们不用再循环过滤整个数据集,而是通过整体统计量+分组统计量的数学推导来实现,性能和代码简洁度都能提升一大截。

核心思路:用数学推导简化计算

先理清楚背后的逻辑:其实根本不需要每次都去过滤掉某个年龄组再算平均,咱们可以用整体的统计数据结合分组数据直接推导:
假设我们有:

  • total_sum:所有样本的阅读能力总和
  • total_count:总样本数量
  • 对于每个年龄组k:
    • group_sum_k:该年龄组的阅读能力总和
    • group_count_k:该年龄组的样本数量

那排除年龄k后的整体平均值,直接就能用这个公式算出来:

(总总和 - 年龄k的总和) / (总数量 - 年龄k的数量)

Pandas 实现代码

用你给的示例数据来演示完整流程:

import pandas as pd

d = pd.DataFrame([[1,10], [2,4],[1, 9], [2,3]], columns=['Age', 'ReadingAbility'])

# 1. 先算整体的总和与总样本数
total_sum = d['ReadingAbility'].sum()
total_count = len(d)

# 2. 按年龄分组,计算每组的总和与样本数
group_stats = d.groupby('Age')['ReadingAbility'].agg(['sum', 'count'])

# 3. 套用公式计算排除当前年龄后的平均值
mu_other_ages = (total_sum - group_stats['sum']) / (total_count - group_stats['count'])

运行后得到的结果完全符合预期:

Age
1    3.5
2    9.5
dtype: float64

为什么这个方法更高效?

  • 性能碾压循环法:原来的循环方法是O(m*n)(m是不同年龄的数量,n是总样本数),每次循环都要过滤整个数据集;而新方法是O(n),只需要遍历数据集两次(一次算整体统计,一次分组统计),数据量越大,性能差距越明显。
  • 代码更简洁易读:没有冗余的循环和过滤操作,逻辑一目了然,维护起来更省心。
  • 适用性极强:不管有多少个年龄分组,这个逻辑都能直接套用,不需要做任何修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:47:07