Imputer均值策略删除NaN而不是替换

时间:2017-06-23 18:25:10

标签: python scikit-learn

我正在尝试使用sklearn.preprocessing.Imputer替换给定数据集中的NaN值。而不是让NaN取代我,而是发现我的代码正在删除它们。这是一个简短的例子,展示了我面临的这个问题:

>>> test_data = np.array([float("NaN"), 1, 2, 3])
>>> imp = Imputer(missing_values=float("NaN"), strategy="mean")
>>> imp.fit_transform(test_data)
** Deprecation warning truncated **
array([[1., 2., 3.]])

我应该更改哪些内容,以便取代NaN而不是取代2.

我尝试从sklearn.preprocessing.Imputer user guide进行调整,最初跟随this answer,但我一定误解了它们。

编辑:

我也尝试了以下内容,它取消了弃用警告,但没有改变最终结果:

>>> test_data = np.array([[float("NaN"), 1, 2, 3]])
>>> imp = Imputer(missing_values=float("NaN"), strategy="mean")
>>> imp.fit_transform(test_data)
array([[1., 2., 3.]])

2 个答案:

答案 0 :(得分:2)

Imputer需要一个数据框。这按预期工作 -

import pandas as pd
from sklearn.preprocessing import Imputer

test_series = pd.Series([float("NaN"), 1, 2, 3])
test_data_frame = pd.DataFrame({"test_series": test_series})
imp = Imputer(missing_values=float("NaN"), strategy="mean")
test_data_frame = imp.fit_transform(test_data_frame)
print(test_data_frame)

答案 1 :(得分:1)

通过重新阅读sklearn.preprocessing.Imputer axis,我找到了问题的答案。事实证明,我遗漏了Imputer()'构造函数的>>> test_data = np.array([float("NaN"), 1, 2, 3]) >>> imp = Imputer(missing_values=float("NaN"), strategy="mean", axis=1) >>> imp.fit_transform(test_data) array([[2., 1., 2., 3.]]) 参数。默认情况下,它设置为0(对列应用策略)但我传递了一行数据,所以我应该使用axis = 1.

这是最终结果,正如最初预期的那样。

const matrix = [[0, 1, 1, 2], [0, 5, 0, 0], [2, 0, 3, 3]];

const sumNotUnderZero = (bottom, top) => 
  top.map((v, i) => v ? v + bottom[i] : v);

const result = matrix.reduceRight(sumNotUnderZero)
  .reduce((s, n) => s + n);

console.log(result);