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

如何在Pandas DataFrame中按多列分组计算滚动均值并保留原索引?

如何在Pandas DataFrame中按多列分组计算滚动均值并保留原索引?

我明白你的问题啦!你想要按type和type2分组计算滚动均值,同时保留原DataFrame的索引,还要在窗口数据不足时也能计算均值(而不是直接显示NaN)。咱们来一步步解决这个问题:

你的现有代码存在两个核心问题:

  1. 滚动窗口的min_periods参数缺失:默认情况下rolling(window=3)的min_periods=3,这意味着只有当窗口内至少有3个数据时才会计算均值,不足的就返回NaN,但你期望的是哪怕只有1个数据也要计算均值。
  2. 索引对齐错误:你用reset_index(drop=True)会把所有索引(包括原DataFrame的行索引)都去掉,导致分组后的滚动结果顺序被打乱,和原数据行对应不上;而尝试reset_index(level=0, drop=True)时,因为分组是两个列,索引层级不匹配,所以会抛出incompatible index的错误。

修正后的解决方案代码

import pandas as pd

data = {'values': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],
        'type':['A','B','A','B','A','B','A','B','A','B','A','B','A','B','A'],
       'type2':['C','D','C','D','C','D','C','D','C','D','C','D','C','D','C']}
df = pd.DataFrame(data)

window_size = 3

# 关键修改:添加min_periods=1,仅移除分组索引层级,保留原行索引以实现对齐
df['mean'] = df.groupby(['type','type2'])['values'].rolling(window=window_size, min_periods=1).mean().reset_index(level=[0,1], drop=True)

print(df)

运行结果(和你期望的一致)

values type type2  mean
0        1    A     C   1.0
1        2    B     D   2.0
2        3    A     C   2.0
3        4    B     D   3.0
4        5    A     C   3.0
5        6    B     D   4.0
6        7    A     C   5.0
7        8    B     D   6.0
8        9    A     C   7.0
9       10    B     D   8.0
10      11    A     C   9.0
11      12    B     D  10.0
12      13    A     C  11.0
13      14    B     D  12.0
14      15    A     C  13.0

代码说明

  • min_periods=1:这个参数让Pandas在窗口数据不足时,用现有的所有数据计算均值(比如第一个数据直接返回自身,第二个数据返回前两个的平均值,第三个及以后返回窗口内3个数据的平均值)。
  • reset_index(level=[0,1], drop=True):这里的level=[0,1]对应分组的两个列(type和type2)的索引层级,移除这两个层级后,剩下的就是原DataFrame的行索引,这样赋值给df['mean']时,Pandas会自动按索引对齐,完全不会打乱原数据的顺序。

备注:内容来源于stack exchange,提问作者Don Woodward

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:14:34