Pandas: 用列中距离最近的'n'个非空值的平均值替换NaN。

3
假设我有以下数据框:
     A      B
0   NaN     12
1   NaN    NaN
2    24    NaN
3   NaN    NaN
4   NaN     13
5   NaN     11
6   NaN     13
7    18    NaN
8    19    NaN
9    17    NaN

在'A'列中,缺失的值需要使用序列中最近3个非空值的平均值进行替换,如果存在的话。

例如,在索引5处的NaN具有18作为其最近的非空值,并且在18之后,下两个值也是非空的。因此,在索引5处的NaN被替换为(18 + 19 + 17)/ 3。

索引4处的NaN具有24作为其最近的非空值,但是24之前的两个值是非空的。因此,在索引4处的NaN不会被替换为任何值。

类似地,需要对其余的列进行处理。是否有人知道一种向量化的方法来完成这项工作?
谢谢!

索引0是什么,A吗? - PV8
1个回答

2
我认为您需要将滚动平均值与另一个向后滚动相结合,然后使用DataFrame.interpolate来替换最近的NaN值为mean值,并对助手DataFrame c进行前向填充以替换最后一组NaN值和后向填充以替换第一组NaN值,从而替换原始DataFrame中的缺失值。"最初的回答"。请保留HTML标记。
a = df.rolling(3).mean()
b = df.iloc[::-1].rolling(3).mean()

c = a.fillna(b).fillna(df).interpolate(method='nearest').ffill().bfill()
print (c)
      A          B
0  24.0  12.000000
1  24.0  12.000000
2  24.0  12.000000
3  24.0  12.333333
4  24.0  12.333333
5  18.0  11.000000
6  18.0  12.333333
7  18.0  12.333333
8  19.0  12.333333
9  18.0  12.333333

df = df.fillna(c)
print (df)
      A          B
0  24.0  12.000000
1  24.0  12.000000
2  24.0  12.000000
3  24.0  12.333333
4  24.0  13.000000
5  18.0  11.000000
6  18.0  13.000000
7  18.0  12.333333
8  19.0  12.333333
9  17.0  12.333333

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接