【问题标题】:Pandas fill nan values using rolling mean熊猫使用滚动平均值填充 nan 值
【发布时间】:2022-01-20 05:18:28
【问题描述】:

我有一个包含 nan 值的数据集,我正在尝试使用滚动平均值填充这些值。我这样做的代码如下:

df = pd.DataFrame({'vals': med_vals})
print(df[353:363])

vals
353 17682.196292
354 13796.403594
355 14880.418179
356 14139.141779
357 15397.070537
358 15108.345602
359 14286.259755
360 14962.745719
361 NaN
362 NaN
df_filled = df.fillna(df.rolling(7,min_periods = 1).mean())
print(df_filled[353:365])

    vals
353 17682.196292
354 13796.403594
355 14880.418179
356 14139.141779
357 15397.070537
358 15108.345602
359 14286.259755
360 14962.745719
361 14795.663595
362 14778.712678
363 14938.605403
364 14785.783692
365 14624.502737
366 14962.745719
367 NaN
368 NaN
369 NaN

我怎样才能让我的代码在计算滚动平均值时考虑到之前填写的值?

编辑:我找到了一个可行的方法,但我对它不太满意:

 while pd.isnull(df).any().any() == True:
        df.fillna(df.rolling(window=8,min_periods = 7).mean(), inplace = True)

【问题讨论】:

    标签: python pandas dataframe fillna


    【解决方案1】:

    你得到的正是你所要求的。当您进行滚动平均时,numpy 将当前单元格作为窗口的右边缘。因此,在设置单元格 361 时:

    355  356  357  358  359  360  361  362  363  364  365 366
     ^-----------------------------^
    

    因为 361 是一个 NaN,所以你得到其他六个的平均值。继续:

    355  356  357  358  359  360  361  362  363  364  365  366
          ^-----------------------------^
               ^-----------------------------^
                    ^-----------------------------^
                         ^-----------------------------^
                              ^-----------------------------^
    

    因此,当它计算 366 的值时,它将从 360 到 366 取平均值。该范围内唯一具有值的单元格是 360,因此它成为平均值。您告诉它,该范围内只需要一个值即可。

    您是说存在问题,但我完全不清楚您的期望。

    【讨论】:

    • 感谢您的澄清,蒂姆。我期望该函数使用之前为 361-365 设置的值来计算 366 的滚动平均值,而不是 NaN 值。
    • 你可以随时shift你的输出;)
    • @Dulann 那只会给你基于假数据的数据。没有意义。
    猜你喜欢
    • 2018-08-16
    • 2019-07-27
    • 2019-08-14
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多