仅当列中的 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
我有一个相当大的数据集,有 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