熊猫,滚动最大值忽略 NaN

时间:2021-04-29 04:36:36

标签: pandas

我想计算过去 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 个答案:

答案 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

答案 1 :(得分:1)

skipna= 的默认值为 True,因此在您的代码中显式添加它不会产生任何效果。如果您将其设置为 False,如果原始 NaN 列中有 NaN,您可能会得到 sales 作为最大值。有一个很好的解释为什么会发生here

在您的示例中,您将在前两行中获得那些 NaN,因为 .rolling(3) 调用告诉熊猫,如果滚动窗口中的值少于 3 个,则将对其进行设置到NaN。您可以将 min_periods 调用中的第二个参数 (.rolling()) 设置为至少需要一个值:

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