无窗口大小的Pandas移动平均或滚动均值

5 投票
1 回答
2307 浏览
提问于 2025-04-18 06:52

我该如何计算一个滚动平均值,或者说移动平均值,让我考虑到我到目前为止看到的所有项目。

假设我有一个如下的数据框:

   col   new_col
0    1      1
1    2      1.5
2    3      2

等等。 现在我想添加一个新列,计算到目前为止这一列中所有项目的平均值。 如果指定一个窗口大小,那我会得到前面几个值是NaN(也就是没有值),然后它才会开始计算滚动窗口。但我需要的正是上面那种情况。

1 个回答

0

下面这段代码正好能完成你想要的功能。不过还有很多可以改进的地方。它使用了一个for循环和if-else语句。其实有更快的方法可以用向量化的函数来实现这个功能。如果你不加上 pd.options.mode.chained_assignment = None 这一部分的话,它还会触发一个警告,叫做 SettingsWithCopyWarning

不过这段代码确实能完成任务:

# Libraries
import pandas as pd
import numpy as np

# Settings
pd.options.mode.chained_assignment = None

# Dataframe with desired input
df = pd.DataFrame({'col':[1,2,3]})

# Make room for a new column
df['new_col'] = np.nan

# Fill the new column with values
for i in df.index + 1:
    if i == 0:
        df['new_col'].iloc[i] = np.nan
    else:
        df['new_col'].iloc[i-1] = pd.rolling_mean(df.col.iloc[:i].values, window = i)[-1]
print(df)

输出结果:

在这里输入图片描述

撰写回答