Присоединитесь к одному набору данных и получите результат 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)