Pandas滚动最大值忽略NaN

3

我希望计算过去3行中的最大值,忽略NaN。我认为skipna可以做到这一点,但实际上并不能。如何忽略NaN,以及skipna的作用是什么?

在此代码中

import pandas as pd

df = pd.DataFrame({'sales': [25, 20, 14]})
df['max'] = df['sales'].rolling(3).max(skipna=True)
print(df)

最后一列是什么。
   sales   max
0     25   NaN
1     20   NaN
2     14  25.0

但我希望它能够实现

   sales   max
0     25  25.0
1     20  25.0
2     14  25.0
2个回答

5

skipna=的默认值为True,因此在代码中显式添加它不会产生任何影响。如果将其设置为False,并且原始的sales列中存在NaN,则可能会得到NaN作为最大值。有一个很好的解释可以在这里找到。

在您的示例中,前两行出现NaN是因为.rolling(3)调用告诉pandas,如果滚动窗口中少于3个值,则它们将被设置为NaN。您可以在.rolling()调用中设置第二个参数(min_periods)以要求至少有一个值:

df['max'] = df['sales'].rolling(3,1).max()
df
#    sales   max
# 0     25  25.0
# 1     20  25.0
# 2     14  25.0

1

您还可以在命令中使用 Series.bfill

df['max'] = df['sales'].rolling(3).max().bfill()

输出:

   sales   max
0     25  25.0
1     20  25.0
2     14  25.0

我可以在我的应用程序中使用df.bfill(n-1).rolling(n).max()。它不能修复数组开头的NaN,但是我的应用程序中有NaN在中间,这才是我真正关心的。 - HAL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接