进行滚动操作时,剩下NaN值。我想通过应用足够短的滚动平均值以适合特定行来解决此问题。这是数据示例:
#get the rolling mean from last 7 days
df = pd.DataFrame(np.random.randint(10, size=10), columns=['values'])
df['rolling7'] = df['values'].rolling(7).mean().round(1)
df.head(10)
values rolling7
0 7 NaN
1 6 NaN
2 3 NaN
3 4 NaN
4 0 NaN
5 9 NaN
6 0 4.1
7 1 3.3
8 3 2.9
9 9 3.7
我想用较短的滚动手段来填充NaN:
第0行滚动(1),第1行滚动(2),等等。
我了解为什么我的代码会失败,但是我不知道如何解决该增量:
m = 0
for row in df.loc[0:6]:
m = ++1
df['rolling7'] = df['values'].rolling(m).mean().round(1)
df.head(10)
values rolling7
0 7 7.0
1 6 6.0
2 3 3.0
3 4 4.0
4 0 0.0
5 9 9.0
6 0 0.0
7 1 1.0
8 3 3.0
9 9 9.0
# and I don't know why it went through entire df even if I specified the rows
答案 0 :(得分:0)
.rolling
在窗口之后带有一个可选参数min_periods
,该参数将为您提供所需的行为。通过将其设置为1
,它将为每一行提供最长的滚动平均值:
In [14]: df = pd.DataFrame(np.random.randint(10, size=10), columns=['values'])
...: df['rolling7'] = df['values'].rolling(7, 1).mean().round(1)
...: df.head(10)
...:
Out[14]:
values rolling7
0 9 9.0
1 0 4.5
2 1 3.3
3 7 4.2
4 9 5.2
5 7 5.5
6 1 4.9
7 3 4.0
8 5 4.7
9 3 5.0
关于为什么您的代码无法正常工作,有两个大问题。首先,m = ++1
与m = 1
相同,因此它永远不会更改其中的值。您可能打算使用m += 1
。每次您为整个df['rolling7'] = df['values'].rolling(m).mean().round(1)
分配rolling7
时,第二df
都会在整个列上操作。