如果策略失败,如何将NaN值归入默认值?

时间:2018-05-29 12:59:55

标签: python scikit-learn imputation

问题

我使用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值,是否有更优雅的方法来计算默认值?

1 个答案:

答案 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.]]