错误在Spider IDE中输入并修复缺失值

时间:2018-04-18 12:39:56

标签: python scikit-learn

我是机器学习的新手,我正在尝试修复Spyder IDE中数据集的缺失数据,所以我想在scikit-learn的python中使用sklearn.preprocessing.Imputer库。所以我在这里得到TypeError: unhashable type: 'slice'的错误。

# IMPORTING THE LIBRARY
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd




# IMPORTING THE DATASET
dataset = pd.read_csv('file:///C:/Users/Bhaskar Das/Desktop/Udemy/Machine_Learning_AZ_Template_Folder/Machine Learning A-Z Template Folder/Part 1 - Data Preprocessing/Section 2 -------------------- Part 1 - Data Preprocessing --------------------/Data.csv')

x = dataset.iloc[:,:].values
# =============================================================================
# Out[4]: 
#    Country   Age   Salary Purchased
# 0   France  44.0  72000.0        No
# 1    Spain  27.0  48000.0       Yes
# 2  Germany  30.0  54000.0        No
# 3    Spain  38.0  61000.0        No
# 4  Germany  40.0      NaN       Yes
# 5   France  35.0  58000.0       Yes
# 6    Spain   NaN  52000.0        No
# 7   France  48.0  79000.0       Yes
# 8  Germany  50.0  83000.0        No
# 9   France  37.0  67000.0       Yes
# =============================================================================

# TAKING CARE OF MISSING DATA
from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values = 'NaN', strategy = 'mean', axis = '0')
imputer = imputer.fit(x[:, 1:3])
x[:, 1:3] = imputer.transform(x[:, 1:3])

我正在显示产生输出中给出的以下错误的确切代码行。

从以上代码抛出错误的行。

imputer = imputer.fit(x[:, 1:3])

输出:

runfile('C:/Users/Bhaskar Das/.spyder-py3/DataPreprocessing-ML.py', wdir='C:/Users/Bhaskar Das/.spyder-py3')
Traceback (most recent call last):

  File "<ipython-input-19-2ed93817316a>", line 1, in <module>
    runfile('C:/Users/Bhaskar Das/.spyder-py3/DataPreprocessing-ML.py', wdir='C:/Users/Bhaskar Das/.spyder-py3')

  File "C:\Users\Bhaskar Das\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "C:\Users\Bhaskar Das\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/Bhaskar Das/.spyder-py3/DataPreprocessing-ML.py", line 142, in <module>
    imputer = imputer.fit(x[:, 1:3])

  File "C:\Users\Bhaskar Das\Anaconda3\lib\site-packages\pandas\core\frame.py", line 2139, in __getitem__
    return self._getitem_column(key)

  File "C:\Users\Bhaskar Das\Anaconda3\lib\site-packages\pandas\core\frame.py", line 2146, in _getitem_column
    return self._get_item_cache(key)

  File "C:\Users\Bhaskar Das\Anaconda3\lib\site-packages\pandas\core\generic.py", line 1840, in _get_item_cache
    res = cache.get(item)

TypeError: unhashable type: 'slice'

4 个答案:

答案 0 :(得分:2)

您的变量x是带有列标签的pandas DataFrame。因此,您使用的语法

x[:, 1:3]

对于沿列维度切片无效,这就是生成错误消息的原因。

所以某处有另一个错误,或者你没有显示你正在使用的确切代码,否则操作

x = dataset.iloc[:,:].values

应返回一个不会导致此错误消息的numpy ndarray。

您在问题中显示的追溯证实了这一点,其中说:

File "C:/Users/Bhaskar Das/.spyder-py3/DataPreprocessing-ML.py", line 142, in <module>
    imputer = imputer.fit(x[:, 1:3])

  File "C:\Users\Bhaskar Das\Anaconda3\lib\site-packages\pandas\core\frame.py", line 2139, in __getitem__
    return self._getitem_column(key)

等等。在imputer调用中被切片的对象绝对是一个pandas DataFrame,这意味着问题中粘贴的代码可能会遗漏您实际代码中的内容。

另请注意,您只需使用pandas直接填写缺失值:

dataset.fillna(
    {'Age': dataset.Age.mean(), 'Salary': dataset.Salary.mean()},
    inplace=True
)

答案 1 :(得分:1)

为什么人们为什么要坚持通过从数据框中提取数组来让他们的生活更加艰难? sklearn与熊猫一起玩得很好!!

一旦你解决了@ely所显示的错误,另一个错误是因为你写的是:

imputer = Imputer(missing_values = 'NaN', strategy = 'mean', axis = '0')

当我认为你的意思是写:

imputer = Imputer(missing_values = 'NaN', strategy = 'mean', axis = 0)

documentation中,它说:

  

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

     

要沿其移动的轴。

     

如果axis = 0,则沿列进行估算。如果axis = 1,则沿着   行。

答案 2 :(得分:0)

您的感冒应该正确,期望'0'应该为0。我已经尝试过。

答案 3 :(得分:0)

from sklearn.preprocessing import imputation
imputer = Imputer(missing_values='Nan', strategy='mean', axis=0)
imputer= imputer.fit(x[:, 1:3])
x[:, 1:3]=imputer.transform(x[:, 1:3])

C:\ Users \ Pravesh \ Anaconda3 \ lib \ site-packages \ sklearn \ utils \ deprecation.py:66:DeprecationWarning:不推荐使用Class Imputer; Imputer在0.20版中已弃用,并将在0.22版中删除。从sklearn导入impute.SimpleImputer。 warnings.warn(msg,category = DeprecationWarning) 追溯(最近一次通话):

文件“”的第3行,在 imputer = imputer.fit(x [:, 1:3])

getitem 中的文件“ C:\ Users \ Pravesh \ Anaconda3 \ lib \ site-packages \ pandas \ core \ frame.py”,第2980行 索引器= self.columns.get_loc(key)

get_loc中的第2897行“ C:\ Users \ Pravesh \ Anaconda3 \ lib \ site-packages \ pandas \ core \ indexes \ base.py” 返回self._engine.get_loc(key)

pandas._libs.index.IndexEngine.get_loc中的文件“ pandas_libs \ index.pyx”,第107行

pandas._libs.index.IndexEngine.get_loc中的文件“ pandas_libs \ index.pyx”,第109行

TypeError:'(slice(None,None,None),slice(1,3,None))'是无效的键

使用相同代码时,我将其作为错误