Pandas中实现增量GroupBy的高效方法
Pandas实现增量GroupBy计算累积均值
你需要的是按increment列进行增量分组:每个分组n对应包含increment从0到n的所有行,计算这些行的v1均值。这里提供两种高效实现方式:
方法一:分组聚合+累积计算(推荐,性能更优)
这种方式先对每个increment组做聚合,再通过累积求和/计数得到整体均值,避免重复遍历数据,适合大数据集:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'v1': [0.1, 0.5, 0.42, 0.4, 0.3, 0.7], 'increment': [0, 0, 1, 1, 2, 2] }) # 1. 按increment分组,计算每组的v1总和与行数 group_agg = df.groupby('increment')['v1'].agg(total='sum', count='size') # 2. 计算累积总和、累积行数,进而得到累积均值 group_agg['cum_total'] = group_agg['total'].cumsum() group_agg['cum_count'] = group_agg['count'].cumsum() group_agg['average of v1'] = (group_agg['cum_total'] / group_agg['cum_count']).round(3) # 3. 整理成预期输出格式 result = group_agg.reset_index().rename(columns={'increment': 'group'})[['group', 'average of v1']] print(result)
输出结果:
group average of v1 0 0 0.300 1 1 0.355 2 2 0.403
方法二:基于expanding窗口计算
利用Pandas的expanding窗口函数,直接计算从开头到当前行的累积均值,再提取每个increment组最后一行的结果:
import pandas as pd df = pd.DataFrame({ 'v1': [0.1, 0.5, 0.42, 0.4, 0.3, 0.7], 'increment': [0, 0, 1, 1, 2, 2] }) # 计算全局累积均值 df['expanding_mean'] = df['v1'].expanding().mean() # 标记每个increment组的最后一行 df['is_last_in_group'] = df['increment'] != df['increment'].shift(-1) # 提取结果并整理格式 result = df[df['is_last_in_group']].rename(columns={'increment': 'group'})[['group', 'expanding_mean']] result['expanding_mean'] = result['expanding_mean'].round(3) result = result.rename(columns={'expanding_mean': 'average of v1'}) print(result)
输出和方法一完全一致。
效率说明
- 方法一的时间复杂度为O(n),先分组聚合再累积,计算量更小,适合百万级以上的大数据集;
- 方法二更直观,但
expanding会逐行计算,数据量大时性能略逊于方法一。
内容的提问来源于stack exchange,提问作者Peslier53
相关产品推荐
相关产品推荐

