[英]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.