Dataframe中某些列上的Imputer

问题描述 投票:0回答:3

我试图在名为age的单个列上使用Imputer来替换缺失的值。但我得到错误为“预期的2D数组,而是获得1D数组:”

以下是我的代码

import pandas as pd
import numpy as np
from sklearn.preprocessing import Imputer

dataset = pd.read_csv("titanic_train.csv")

dataset.drop('Cabin',axis = 1,inplace = True)
x = dataset.drop('Survived',axis = 1)
y = dataset['Survived']

imputer = Imputer(missing_values ="nan",strategy = "mean",axis = 1)
imputer=imputer.fit(x['Age'])
x['Age']=imputer.transform(x['Age'])
pandas machine-learning scikit-learn imputation
3个回答
4
投票

Imputer期望一个二维数组作为输入,即使其中一个维度的长度为1.这可以使用np.reshape来实现:

imputer = Imputer(missing_values='NaN', strategy='mean')
imputer.fit(x['Age'].values.reshape(-1, 1))
x['Age'] = imputer.transform(x['Age'].values.reshape(-1, 1))

也就是说,如果你没有做任何比使用均值填充缺失值更复杂的事情,你可能会发现更容易完全跳过Imputer而只是使用Pandas fillna代替:

x['Age'].fillna(x['Age'].mean(), inplace=True)

3
投票

虽然@thesilkworkm在路边打败了我,但知道为什么你自己的代码不起作用可能会有用。

因此,除了重塑问题之外,您的代码中还有两个错误;第一个是你错误地在你的imputer中要求axis=1,而你应该要求axis=0(这是默认值,这就是为什么它在完全省略时起作用,如在@ thesilkworkm'答案中);来自docs

axis:整数,可选(默认= 0)

轴所沿着的轴。

  • 如果axis = 0,则沿列进行插补。
  • 如果axis = 1,则沿行输入。

第二个错误是你的missing_values论证,它应该是'NaN',而不是'nan';再次来自docs

missing_values:整数或“NaN”,可选(默认=“NaN”)

缺少值的占位符。所有出现的missing_values都将被估算。对于编码为np.nan的缺失值,请使用字符串值“NaN”。

因此,仅仅为了提供替代但等效的解决方案(超出@thesilkworm已经提供的解决方案),您还可以在一行中进行拟合和转换:

imp = Imputer(missing_values ="NaN",strategy = "mean",axis = 0)
x['Age'] = imp.fit_transform(x['Age'].reshape(-1,1))

0
投票

如果你适合转换它使用reshape(-1,1)。因为方法期望2D数组作为输入,但是您提供1D数组。

例如:x ['Age'] = imputer.transform(x ['Age']。reshape(-1,1))

© www.soinside.com 2019 - 2024. All rights reserved.