【问题标题】:How to ignore NaN values for a rolling mean calculation in pandas DataFrame?如何在 pandas DataFrame 中忽略滚动平均值计算的 NaN 值?
【发布时间】:2022-01-07 06:27:55
【问题描述】:

我尝试创建一个 DataFrame,其中包含基于长度为 5 的窗口的滚动平均值。但我的数据包含一个 NaN 值,因此我只获得第 3 列的 NaN 值和 NaN 值.使用.rolling(5).mean() 时如何忽略NaN 值?

我有这个样本数据df1

    Column1 Column2 Column3 Column4
0   1       5       -9.0    13
1   1       6       -10.0   15
2   3       7       -5.0    11
3   4       8       NaN     9
4   6       5       -2.0    8
5   2       8       0.0     10
6   3       8       -3.0    12

为了方便:

#create DataFrame with NaN
df1 = pd.DataFrame({
                    'Column1':[1, 1, 3, 4, 6, 2, 3], 
                    'Column2':[5, 6, 7, 8, 5, 8, 8], 
                    'Column3':[-9, -10, -5, 'NaN', -2, 0, -3], 
                    'Column4':[13, 15, 11, 9, 8, 10, 12]
                    })
df1 = df1.replace('NaN',np.nan)
df1

当我使用基于 5 窗口创建滚动平均值时,我仅获得第 3 列的 NaN 值。

df2 = df1.rolling(5).mean()


    Column1 Column2 Column3 Column4
0   NaN     NaN     NaN     NaN
1   NaN     NaN     NaN     NaN
2   NaN     NaN     NaN     NaN
3   NaN     NaN     NaN     NaN
4   3.0     6.2     NaN     11.2
5   3.2     6.8     NaN     10.6
6   3.6     7.2     NaN     10.0

【问题讨论】:

    标签: python pandas dataframe nan


    【解决方案1】:

    Pandas 的意思是有一个 skipna 标志被告知忽略 NaN 看到

    https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.mean.html

    试试

    df2 = df1.rolling(5).mean(skipna=True)
    

    df2 = df1.rolling(5).apply(pd.np.nanmean)
    

    【讨论】:

    • 这仍然会导致 Column3 被 NaN 填充。此外,skipna 无论如何默认为 True
    • 非常感谢您的回答。只有当我将上面的 'NaN' 更改为 'NA' 时,您的答案才有效。你知道这可能是什么原因吗?
    【解决方案2】:

    您应该使用 0 或均值对 NaN 进行插值。

    下面的作品。

    df1 = df1.fillna(df1.mean())
    
    df2 = df1.rolling(5).mean()
    

    【讨论】:

    • 感谢您的回答!就我而言,我不想插值。
    猜你喜欢
    • 2018-09-15
    • 2016-10-24
    • 1970-01-01
    • 2019-05-15
    • 2014-09-03
    • 2016-04-09
    • 2016-04-04
    相关资源
    最近更新 更多