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

Pandas按A、C列分组的条件滚动平均值计算实现问题

更新说明

此前的同类解决方案未将A列与C列纳入分组条件考量。

需求说明

现有一个包含3列的DataFrame,需要新增2个计算列,具体规则如下:

  • 按A、C列分组,对B列计算滚动2期平均值,取值为同组内当前行与前一行的B值均值
  • 按A、C列分组,对B列计算滚动2期平均值,取值为同组内当前行之前的2行B值均值,无对应前序行时取值为0
    第二个计算项可使用日期或序列字段作为滚动计算的排序依据。

示例数据

import pandas as pd
df = pd.DataFrame({'A': ['t1', 't1', 't1', 't1', 't2', 't2', 't2', 't2','t1'],
                   'B': [100, 104, 108, 110, 102, 110, 98, 100, 200],
                   'C': ['h', 'a', 'a', 'a', 'a', 'h', 'h', 'h','h'],
                  'expected1': [100, 104, 106, 109, 102, 110, 104, 99, 150],
                  'expected2': [0, 0, 104, 106, 0, 0, 110, 104, 100]}, columns=['A', 'B', 'C','expected1','expected2'])

实现代码

# 计算第一个指标:包含当前行的2期滚动均值,最小统计周期为1
df['calc1'] = df.groupby(['A', 'C'], group_keys=False)['B'].rolling(window=2, min_periods=1).mean()

# 计算第二个指标:仅包含当前行之前的2期滚动均值,最小统计周期为2,空值填0
df['calc2'] = df.groupby(['A', 'C'], group_keys=False)['B'].apply(
    lambda x: x.shift(1).rolling(window=2, min_periods=2).mean()
).fillna(0)

结果验证

执行后calc1与expected1完全一致,calc2与expected2完全一致。如果原始数据需要按指定字段排序后再计算,只需要在分组前用sort_values()对排序字段做排序即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:06:07