IndexError:数组索引太多,同时处理丢失的数据

时间:2018-01-07 17:11:09

标签: python numpy scikit-learn

我知道在SO之前已经多次询问过同样的问题,但我在python和机器学习方面都是一个新手,在尝试了很多次没有结果之后,我终于在这里发布了它。如果可能的话,请原谅我这样的问题。

我有一个这样的数据集,采用csv格式

YearsExperience        Salary
1.1                    39343
1.3                    46205
1.5                    37731
2                      43525
2.2                    
2.9                    56642

正如你可以看到的经验2.2工资数据缺失,我试图用平均数填写,并做一些像下面这样的事情

import numpy as np
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('Salary_Data.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 1].values

#taking care of missing data
#substitue missing value with the mean
from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values='NaN',strategy='mean',axis=0)
imputer = imputer.fit(y[:,0:1])
y[:,0:1] = imputer.transform(y[:,0:1]);

它给了我

IndexError: too many indices for array

但是,如果X喜欢

中缺少某些内容
YearsExperience        Salary
1.1                    39343
1.3                    46205
1.5                    37731
2                      43525
                       39891
2.9                    56642

如果我执行以下操作,它会自动使用mean

替换缺失的值
from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values='NaN',strategy='mean',axis=0)
imputer = imputer.fit(X[:,0:1])
X[:,0:1] = imputer.transform(X[:,0:1]);

1 个答案:

答案 0 :(得分:2)

代码失败的平均原因是因为y是具有形状的一维数组 -

X = df.iloc[:, :-1].values
y = df.iloc[:, 1].values

y.shape
(6,)

因此,在一维数组上调用y[:, 0:1]是无效的操作 -

y[:,0:1]
IndexError: too many indices for array

相反,您应该做的就是初始化y -

y = df.iloc[:, -1:].values

哪会使y一个二维数组有一列,解决问题。

imputer接受具有单个列的2D数组,并返回类似形状的结果。切割单个列数据帧,并将其传递给imputer.fit_transform,后者只需一步即可执行拟合和转换 -

df['Salary'] = imputer.fit_transform(df[['Salary']]).ravel()
df

   YearsExperience   Salary
0              1.1  39343.0
1              1.3  46205.0
2              1.5  37731.0
3              2.0  43525.0
4              2.2  44689.2
5              2.9  56642.0