我知道在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]);
答案 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