繁体   English   中英

基于反向移动平均线填充nan

[英]Filling nan based on reverse moving average

首先,这里的简化示例是一个带有一些 nans 的小型 dataframe:

    A   B   C
0   NaN NaN NaN
1   NaN NaN NaN
2   2.0 1.0 NaN
3   2.0 NaN NaN
4   0.0 4.0 2.0
5   NaN 2.0 5.0
6   NaN 3.0 1.0

我的目标是填充 C 列中的所有 NaN(只需忽略 A 和 B,它们在这里是为了使其成为数据框),使其看起来像这样:

    A   B   C
0   NaN NaN 2.839506
1   NaN NaN 2.629630
2   2.0 1.0 3.222222
3   2.0 NaN 2.666667
4   0.0 4.0 2.0
5   NaN 2.0 5.0
6   NaN 3.0 1.0

以相反的方式,每个 nan 都填充了前三个值的移动平均值,例如 2.666667 = (2.0+5.0+1.0) 和 3.222222 = (2.666667+5.0+2.0)。 这样一来,整个列将被完全填满而不离开nan。

我一直在这里使用pd.rolling(window = n, min_periods = 1)shift()尝试一些解决方案,但他们没有这样做。 此外,由于这是一个简化的示例,而完整的数据集有超过 30000 行(缺少 20% 的值),因此 for 循环将非常耗时。 不使用df[::-1]应该有一种非常清晰和优雅的方式 - 反转整个系列,获取滚动方式,然后将其反转 - 但即使这个技巧也行不通。

Pandas 不支持滚动有副作用。 我只能将循环视为解决问题的方法。 循环 30,000 行并不是什么大问题; 重复调用df.loc是因为 function 非常慢。

您可以将C转换为 numpy 数组以提高速度:

reversed_c = df["C"].to_numpy()[::-1]
for i, value in enumerate(reversed_c):
    if i < 3 or ~np.isnan(value):
        continue
    reversed_c[i] = np.mean(reversed_c[i-3:i])
df["C"] = reversed_c[::-1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM