Присоединитесь к одному набору данных и получите результат OneHotEncoder в Pandas

Давайте рассмотрим набор данных о ценах на жилье из этого примера.

У меня весь набор данных хранится в housing переменная:

housing.shape

(20640, 10)

Я также сделал кодировку OneHotEncoder одного измерения и получить housing_cat_1hot, так

housing_cat_1hot.toarray().shape

(20640, 5)

Моя цель - объединить две переменные и хранить все в одном наборе данных.

Я пробовал учебник по объединению с индексом, но проблема в том, что вторая матрица не имеет никакого индекса. Как я могу сделать соединение между housing а также housing_cat_1hot?

>>> left=housing
>>> right=housing_cat_1hot.toarray()
>>> result = left.join(right)

Traceback (последний вызов был последним): Файл "", строка 1, в результате = left.join(справа) Файл "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pandas/core/frame.py", строка 5293, в соединении rsuffix=rsuffix, sort=sort) Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/ 3.6 / lib / python3.6 / pandas / core / frame.py ", строка 5323, в _join_compat can_concat = all(df.index.is_unique для df в кадрах) Файл" /usr/local/Cellar/python3/3.6.3 /Frameworks/Python.framework/Versions/3.6/lib/python3.6/pandas/core/frame.py ", строка 5323, в can_concat = all (df.index.is_unique для df в кадрах) AttributeError: 'numpy.ndarray'У объекта нет атрибута' индекс '

3 ответа

Решение

Ну, зависит от того, как вы создали горячий вектор. Но если он отсортирован так же, как ваш исходный DataFrame, и сам является DataFrame, вы можете добавить тот же индекс перед присоединением:

housing_cat_1hot.index = range(len(housing_cat_1hot))

И если это не DataFrame, конвертируйте его в один. Это просто, если оба объекта отсортированы одинаково

Изменить: Если это не DataFrame, то: housing_cat_1hot = pd.DataFrame(housing_cat_1hot)

Уже создает правильный индекс для вас

Если вы хотите объединить два массива (при условии, что оба жилищный_кат_1 и корпус являются массивами), вы можете использовать

housing = np.hstack((housing, housing_cat_1hot))

Хотя лучший способ OneHotEncode для переменной - выбрать эту переменную в массиве и кодировать. Это избавит вас от необходимости присоединиться к двум позже

Скажем, индекс переменной, которую вы хотите закодировать в вашем массиве, равен 1,

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
le = LabelEncoder()  
X[:, 1] = le.fit_transform(X[:, 1])

onehotencoder = OneHotEncoder(categorical_features = [1])
X = onehotencoder.fit_transform(X).toarray()

Благодаря ответу @Elez-Shenhar я получаю следующий рабочий код:

OneHot=housing_cat_1hot.toarray()
OneHot= pd.DataFrame(OneHot)
result = housing.join(OneHot)
result.shape

(20640, 15)

Другие вопросы по тегам