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

如何高效获取Pandas分组后每组最后一行的扩展均值?

高效获取分组最后一行的排除自身扩展均值

当数据集规模较大时,全量计算每行的扩展均值再筛选最后一行的做法效率很低,我们可以直接利用分组的统计量推导目标结果,避免不必要的计算。

核心思路

每组最后一行的排除当前行的扩展均值,等价于该组前n-1个元素的均值,计算公式为:
mean_number = (组内number总和 - 当前行number) / (组内元素数量 - 1)

实现代码

方法一:直接计算分组统计量+筛选最后一行

这种方法仅处理必要数据,内存和时间效率最优:

import pandas as pd

data = {
  'id': [1, 2, 3, 4, 5, 6, 7, 8],
  'name': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
  'number': [1, 3, 5, 7, 9, 11, 13, 15]
}

df = pd.DataFrame(data)

# 计算每组的number总和与元素个数
group_stats = df.groupby('name')['number'].agg(total='sum', count='size')

# 获取每组最后一行数据
last_rows = df.groupby('name').last().reset_index()

# 计算目标均值
last_rows['mean_number'] = (group_stats.loc[last_rows['name'], 'total'].values - last_rows['number']) / (group_stats.loc[last_rows['name'], 'count'].values - 1)

# 调整列顺序匹配需求
last_rows = last_rows[['id', 'name', 'number', 'mean_number']]
print(last_rows)

运行输出:

id name  number  mean_number
0   7    A      13          5.0
1   8    B      15          7.0

方法二:用transform映射统计量(代码更简洁)

如果数据集规模适中,也可以用transform把分组统计量映射到每行,再筛选最后一行计算:

import pandas as pd

data = {
  'id': [1, 2, 3, 4, 5, 6, 7, 8],
  'name': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
  'number': [1, 3, 5, 7, 9, 11, 13, 15]
}

df = pd.DataFrame(data)

# 给每行添加所属组的总和与元素个数
df['group_total'] = df.groupby('name')['number'].transform('sum')
df['group_count'] = df.groupby('name')['number'].transform('size')

# 筛选每组最后一行并计算均值
result = df.groupby('name').last().assign(
    mean_number=lambda x: (x['group_total'] - x['number']) / (x['group_count'] - 1)
).reset_index()[['id', 'name', 'number', 'mean_number']]

print(result)

效率对比

原方法需要对每组的每一行计算扩展均值,时间复杂度为O(nk)(k为每组元素个数);而新方法仅做两次分组聚合操作,时间复杂度为O(n),在大数据集下性能提升非常显著。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:05:20