仅当列中的 NaN 少于给定数量时,如何用列平均值替换 NaN?

How to replace NaN with column mean only if less than a given number of NaN in a column?

我有一个相当大的数据集,有 200 行和 6000 多列。

我已经知道 Pandas 用每列的平均值替换 NaN 的函数:

df.fillna(df.mean())

我的问题是,我只想在 NaN 总数等于或小于 3 的那些列上使用它。 任何提示或解决方案将不胜感激。

以下应该有效:

m = df.isna().sum(0).le(3)
df.loc[:,m] = df.loc[:,m].fillna(df.loc[:,m].mean(0))

检查测试数据帧:

df = pd.DataFrame(np.random.choice([float('nan'), *range(3)], (10, 3)))

print(df)

   0    1    2
0  NaN  1.0  0.0
1  2.0  0.0  NaN
2  0.0  1.0  0.0
3  NaN  1.0  0.0
4  2.0  NaN  1.0
5  NaN  2.0  1.0
6  2.0  2.0  NaN
7  NaN  NaN  NaN
8  1.0  NaN  0.0
9  2.0  0.0  2.0

m = df.isna().sum(0).le(3)
df.loc[:,m] = df.loc[:,m].fillna(df.loc[:,m].mean(0))

print(df)

     0    1         2
0  NaN  1.0  0.000000
1  2.0  0.0  0.571429
2  0.0  1.0  0.000000
3  NaN  1.0  0.000000
4  2.0  1.0  1.000000
5  NaN  2.0  1.000000
6  2.0  2.0  0.571429
7  NaN  1.0  0.571429
8  1.0  1.0  0.000000
9  2.0  0.0  2.000000