Python "TypeError: unhashable type: 'slice'" для кодирования категориальных данных
Я получаю
TypeError: unhashable type: 'slice'
при выполнении приведенного ниже кода для кодирования категориальных данных в Python. Кто-нибудь может помочь?
# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Importing the dataset
dataset = pd.read_csv('50_Startups.csv')
y=dataset.iloc[:, 4]
X=dataset.iloc[:, 0:4]
# Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
X[:, 3] = labelencoder_X.fit_transform(X[:, 3])
Ответы
Ответ 1
X
является фреймом данных, и к нему нельзя получить доступ через терминологию срезов, например X[:, 3]
. Вы должны получить доступ через iloc
или X.values
. Однако то, как вы сконструировали X
сделало его копией... так. Я бы использовал values
# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Importing the dataset
# dataset = pd.read_csv('50_Startups.csv')
dataset = pd.DataFrame(np.random.rand(10, 10))
y=dataset.iloc[:, 4]
X=dataset.iloc[:, 0:4]
# Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
# I changed this line
X.values[:, 3] = labelencoder_X.fit_transform(X.values[:, 3])
Ответ 2
Использовать значения либо при создании переменной X, либо при кодировании, как указано выше
# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Importing the dataset
# dataset = pd.read_csv('50_Startups.csv')
dataset = pd.DataFrame(np.random.rand(10, 10))
y=dataset.iloc[:, 4].values
X=dataset.iloc[:, 0:4].values
Ответ 3
При создании вектора X
и Y
используется вектор values
.
X=dataset.iloc[:,4].values
Y=dataset.iloc[:,0:4].values
Это определенно решит вашу проблему.
Ответ 4
если вы используете .Values при создании векторов матрицы X и Y, это решит проблему.
y=dataset.iloc[:, 4].values
X=dataset.iloc[:, 0:4].values
когда вы используете .Values, он создает представление Object созданной матрицы, которая будет возвращена с удаленными осями. Проверьте ссылку ниже для получения дополнительной информации
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.values.html
Ответ 5
Я получаю ту же ошибку (TypeError: unhashable type: 'slice') с кодом ниже:
included_cols = [2,4,10]
dataset = dataset[:,included_cols] #Columns 2,4 and 10 are included.
Решено с помощью кода ниже, поместив iloc после набора данных:
included_cols = [2,4,10]
dataset = dataset.iloc[:,included_cols] #Columns 2,4 and 10 are included.
Ответ 6
Попробуйте изменить X [:, 3] на X.iloc [:, 3] в кодировщике меток
Ответ 7
Источник данных: https://github.com/franklinwillemen/Machine_Learning/blob/master/Regression/Multiple_Linear_Regression/50_startups.csv
# Import Packages
import pandas as pd
## Load and display Dataset
dataset = pd.read_csv('file:///C:/Users/SayaliSonawane/Desktop/StackOverflow/q1/50_startups.csv')
dataset.head()
Out[]:
R&D Spend Administration Marketing Spend State Profit
0 165349.20 136897.80 471784.10 New York 192261.83
1 162597.70 151377.59 443898.53 California 191792.06
2 153441.51 101145.55 407934.54 Florida 191050.39
3 144372.41 118671.85 383199.62 New York 182901.99
4 142107.34 91391.77 366168.42 Florida 166187.94
# Check Data : Print Information of All Columns
dataset.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 50 entries, 0 to 49
Data columns (total 5 columns):
R&D Spend 50 non-null float64
Administration 50 non-null float64
Marketing Spend 50 non-null float64
State 50 non-null object
Profit 50 non-null float64
dtypes: float64(4), object(1)
memory usage: 2.0+ KB
# Separate Target variable from features
y=dataset.iloc[:, 4]
X=dataset.iloc[:, 0:4]
# Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
Я верю, что вы пытаетесь использовать кодировщик меток в столбце "Состояние" ("Третий столбец"). Вы можете использовать LabelEncoder или метод get_dummies pandas для преобразования категориальной переменной в переменную индикатора.
X[:, 3] = labelencoder_X.fit_transform(X[:, 3])
Как предложено в ответах выше, вы можете использовать iloc для доступа к третьему столбцу или напрямую использовать имя столбца для доступа к третьему столбцу.
X.iloc[:, 3] = labelencoder_X.fit_transform(X.iloc[:, 3])
ИЛИ ЖЕ
X['State'] = labelencoder_X.fit_transform(X['State'])
X.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 50 entries, 0 to 49
Data columns (total 4 columns):
R&D Spend 50 non-null float64
Administration 50 non-null float64
Marketing Spend 50 non-null float64
State 50 non-null int64
dtypes: float64(3), int64(1)
memory usage: 1.6 KB
X.head()
Out[]:
R&D Spend Administration Marketing Spend State
0 165349.20 136897.80 471784.10 2
1 162597.70 151377.59 443898.53 0
2 153441.51 101145.55 407934.54 1
3 144372.41 118671.85 383199.62 2
4 142107.34 91391.77 366168.42 1
Ответ 8
Ваши значения x и y не работают, поэтому вы, прежде всего, начинаете писать эту точку
import numpy as np
import pandas as pd
import matplotlib as plt
dataframe=pd.read_csv(".\datasets\Position_Salaries.csv")
x=dataframe.iloc[:,1:2].values
y=dataframe.iloc[:,2].values
x1=dataframe.iloc[:,:-1].values
ценностное значение есть опубликовать