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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:55:34