如何高效获取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
相关产品推荐
相关产品推荐

