假设我有以下数据框。
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 不会被任何值替换。
同样,需要对其余列进行处理。有谁知道这样做的矢量化方式?
谢谢!
最佳答案
我相信您需要将滚动与 mean
结合起来再从后面滚动,然后使用 DataFrame.interpolate
替换最近的 NaN
由 mean
s 对最后一组 NaN
进行前向填充s 和第一组 NaN 的回填,用于辅助 DataFrame c
,用于替换原始 DataFrame 的缺失值:
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
关于python - Pandas : Replace NaNs with mean of 'n' nearest non-empty values in column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57393103/