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 

ценностное значение есть опубликовать