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

求助:Pandas滚动均值计算未成功,如何生成指定格式结果?

解决方案

我来帮你搞定这个问题~首先咱们先明确你的需求:你想要把9行数据分成3个不重叠的3行窗口,每个窗口计算Var_1和Var_2的均值,并且把均值对应到窗口的中间日期,最终得到3行2列(带日期索引)的结果。

你之前的代码用了rolling(3).mean(),但这里有两个关键问题:

  1. 默认的滚动窗口是右对齐的,计算出的均值会对应窗口的最后一行日期,而不是你想要的中间日期;
  2. 默认的滚动窗口是重叠滑动的,会生成7个非NaN结果,而不是你需要的3个不重叠的结果。

方法一:滚动窗口+筛选指定行

我们可以用center=True让滚动窗口的均值对应到中间行,然后筛选出每个不重叠窗口的中间行即可:

import pandas as pd

# 先构造你的DataFrame
data = {
    'Dates': ['2018-01-09', '2018-01-10', '2018-01-11', '2018-01-12', '2018-01-13', '2018-01-14', '2018-01-15', '2018-01-16', '2018-01-17'],
    'Var_1': [612.0, 348.0, 350.0, 335.0, 334.0, 325.0, 580.0, 334.0, 325.0],
    'Var_2': [368.0, 348.0, 337.0, 337.0, 900.0, 325.0, 317.0, 900.0, 325.0]
}
df = pd.DataFrame(data)

# 1. 设置日期为索引,计算中心对齐的3行滚动均值
rolling_result = df.set_index('Dates').rolling(3, center=True).mean()

# 2. 筛选出每个不重叠窗口的中间行(索引1、4、7,对应3个窗口的中间日期)
result = rolling_result.iloc[1::3]

# 如果需要把日期作为普通列而不是索引,执行下面这行
# result = rolling_result.iloc[1::3].reset_index()

运行后result就是你要的目标结果:

Var_1       Var_2
Dates                        
2018-01-10  436.666667  351.000000
2018-01-13  331.333333  520.666667
2018-01-16  413.000000  514.000000

方法二:分组计算均值

如果你更倾向于直接分组计算(把9行分成3组,每组3行),也可以用groupby,逻辑会更直观:

# 按每3行分组,计算均值并取每组的中间日期
grouped = df.groupby(df.index // 3).agg({
    'Dates': lambda x: x.iloc[1],  # 提取每组的中间日期
    'Var_1': 'mean',
    'Var_2': 'mean'
}).set_index('Dates')

这个方法得到的结果和上面完全一致,直接把数据拆成3个独立分组,每组取中间日期和列均值。

为什么你的原始代码没成功?

再回头看你的代码df.set_index('Dates').rolling(3).mean().reset_index():

  • 它计算的是重叠滑动窗口的右对齐均值,比如2018-01-11对应的是前3行(0-2)的均值,而不是你想要的对应2018-01-10;
  • 结果会生成7个非NaN行(从第3行开始),不符合你要3行的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:27:34