pandas 中的列滚动平均值

Column-wise rolling mean in pandas

我正在处理一个包含数百万行和 15 列(时间序列特征)的大型数据集(宽格式)。

我想计算每个观察值的移动平均值。我可以使用下面的代码块来做到这一点。但是,它需要将数据帧转换为长格式。但是,我认为随着数据集的增长,这(将宽转换为长,反之亦然)效率会很低。另外,我需要处理 .groupby().

我可以按列方式计算滚动平均值吗?

请在下面找到当前方法的最小可重现示例。

import pandas as pd
df = pd.DataFrame({'id': range(3), 
                   'Date_1': range(3, 6), 
                   'Date_2': range(4, 7), 
                   'Date_3': range(5, 8),
                   'Date_4': range(6, 9),
                   'Date_5': range(11, 14)})
df
   id  Date_1  Date_2  Date_3  Date_4  Date_5
0   0       3       4       5       6      11
1   1       4       5       6       7      12
2   2       5       6       7       8      13
df = pd.melt(df, id_vars= "id")
df = df.sort_values(["id", "variable"])
df
    id variable  value
0    0   Date_1      3
3    0   Date_2      4
6    0   Date_3      5
9    0   Date_4      6
12   0   Date_5     11
1    1   Date_1      4
4    1   Date_2      5
7    1   Date_3      6
10   1   Date_4      7
13   1   Date_5     12
2    2   Date_1      5
5    2   Date_2      6
8    2   Date_3      7
11   2   Date_4      8
14   2   Date_5     13
df["ma"] = df.groupby("id")["value"].rolling(3).mean().values
    id variable  value        ma
0    0   Date_1      3       NaN
3    0   Date_2      4       NaN
6    0   Date_3      5  4.000000
9    0   Date_4      6  5.000000
12   0   Date_5     11  7.333333
1    1   Date_1      4       NaN
4    1   Date_2      5       NaN
7    1   Date_3      6  5.000000
10   1   Date_4      7  6.000000
13   1   Date_5     12  8.333333
2    2   Date_1      5       NaN
5    2   Date_2      6       NaN
8    2   Date_3      7  6.000000
11   2   Date_4      8  7.000000
14   2   Date_5     13  9.333333

所需的输出如下。可以删除 NaN 列,但目前这并不重要。

df[["id", "variable", "ma"]].pivot("id", columns = "variable", 
values = "ma")
variable  Date_1  Date_2  Date_3  Date_4    Date_5
id                                                
0            NaN     NaN     4.0     5.0  7.333333
1            NaN     NaN     5.0     6.0  8.333333
2            NaN     NaN     6.0     7.0  9.333333

编辑:感谢@Mortz 和@PanagiotisKanavo 的提示 谢谢

rolling 方法接受一个 axis 参数,您可以将其设置为 1 -

import pandas as pd
df = pd.DataFrame({'id': range(3), 
                   'Date_1': range(3, 6), 
                   'Date_2': range(4, 7), 
                   'Date_3': range(5, 8),
                   'Date_4': range(6, 9),
                   'Date_5': range(11, 14)})

df = df.set_index('id')
df.rolling(3, axis=1).mean()
    Date_1  Date_2  Date_3  Date_4    Date_5
id                                          
0      NaN     NaN     4.0     5.0  7.333333
1      NaN     NaN     5.0     6.0  8.333333
2      NaN     NaN     6.0     7.0  9.333333