python - Pandas : Replace NaNs with mean of 'n' nearest non-empty values in column

标签 python pandas

假设我有以下数据框。

     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 替换最近的 NaNmean 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/

相关文章:

python - 如何在 python 控制台中运行 Odoo ORM 方法?

python - 分配一个 pandas dataframe NULL=0, non-NULLvalue=1

python - 从 Dataframe 中新列的索引中提取数据

python - 计算字符串中的字符数,创建一个数据框列?

python - 在 Python 中检查集合是否包含给定范围内的数字的最快方法

python - 如何从python中的列表元素中删除符号

python - 为什么python模块newspaper3k只返回腾讯、新浪和wallstreetcn的0篇文章?

python - 安全地将 float 向下转换为尽可能小的整数类型

python - 有没有办法防止 pandas to_json 添加\?

python - 在 Python 中获取 GIF 图像的第一帧?