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