在数据框中的某些列上插入错误

时间:2018-09-18 10:44:49

标签: pandas machine-learning scikit-learn imputation

我正在尝试在名为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'])

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:3)

尽管@thesilkworkm在路边打败了我,但了解为什么您自己的代码无法正常工作可能很有用。

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

  

:整数,可选(默认= 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))

答案 2 :(得分:0)

当您进行适合变换时,请使用reshape(-1,1)。因为method需要2D数组作为输入,但是您却要提供1D数组。

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