求助:Pandas滚动均值计算未成功,如何生成指定格式结果?
解决方案
我来帮你搞定这个问题~首先咱们先明确你的需求:你想要把9行数据分成3个不重叠的3行窗口,每个窗口计算Var_1和Var_2的均值,并且把均值对应到窗口的中间日期,最终得到3行2列(带日期索引)的结果。
你之前的代码用了rolling(3).mean(),但这里有两个关键问题:
- 默认的滚动窗口是右对齐的,计算出的均值会对应窗口的最后一行日期,而不是你想要的中间日期;
- 默认的滚动窗口是重叠滑动的,会生成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
相关产品推荐
相关产品推荐

