我使用sklearn.preprocessing.Imputer类在列上使用 mean 策略来估算NaN值,即axis = 0。我的问题是,某些需要估算的数据仅在其列中具有NaN值,例如:当只有一个条目时。
import numpy as np
import sklearn.preprocessing import Imputer
data = np.array([[1, 2, np.NaN]])
data = Imputer().fit_transform(data)
这会产生array([[1., 2.]])
很明显,很明显,Imputer无法计算一组全部为NaN的值的均值。但是,在我的情况下为0,而不是删除值我想回到默认值。
要解决此问题,我首先检查整列是否仅包含NaN值,如果是,请将其替换为我的默认值0:
# Loop over all columns in data
for column in data.T:
# Check if all values in column are NaN
if all(np.isnan(value) for value in column):
# Fill the column with default value 0
column.fill(0)
如果整个轴只包含NaN值,是否有更优雅的方法来计算默认值?
答案 0 :(得分:3)
这是一个矢量化解决方案,可以完成你在for循环中所做的事情,因此应该更快
default = 0
data[:, np.isnan(data).all(axis=0)] = default
然后,您可以将Imputer().fit_transform()
方法应用于新的data
。
实施例
data = np.array([[np.nan, 1, 1], [np.nan]*3, [1, 2, 3]]).T
看起来像
[[nan nan 1.]
[ 1. nan 2.]
[ 1. nan 3.]]
应用我们的方法删除nan
s
default = 0
data[:, np.isnan(data).all(axis=0)] = default
我们得到了
[[nan 0. 1.]
[ 1. 0. 2.]
[ 1. 0. 3.]]