#python #label #categorical-data #one-hot-encoding
#python #метка #категориальный-данные #one-hot-encoding
Вопрос:
я использую OneHotEncoder для преобразования категориального столбца в числовые данные, но алгоритм изменяет имя столбцов. как сохранить столбцы с одинаковыми именами?
(Я использую python 3)
Мой фрейм данных выглядит следующим образом :
>>> import pandas
>>> import numpy
>>> ar = numpy.array([['yassine', 1], ['jack',7], ['ahmed',4]])
>>> df = pandas.DataFrame(ar, columns = ['name', 'label'])
>>> df
name label
0 yassine 1
1 jack 7
2 ahmed 4
>>> import category_encoders as ce
>>> ohe = ce.OneHotEncoder(handle_unknown='ignore',
use_cat_names=True)
>>> label_fournisseur = ohe.fit_transform(list(df['name']))
>>> label_fournisseur
0_yassine 0_jack 0_ahmed
0 1 0 0
1 0 1 0
2 0 0 1
Мне нужно, чтобы столбцы оставались неизменными без каких-либо изменений:
yassine jack ahmed
0 1 0 0
1 0 1 0
2 0 0 1
Спасибо
Ответ №1:
Вы можете изменять имена столбцов по своему усмотрению. Чтобы удалить «0_», вы можете сделать, например:
label_fournisseur.columns = [ x[2:] for x in label_fournisseur.columns ]
Другой способ получить то, что вы хотите (без другой библиотеки):
pandas.get_dummies(df["name"])
результаты в:
ahmed jack yassine
0 0 0 1
1 0 1 0
2 1 0 0
Примечание: get_dummies выполняет одно горячее кодирование, если входные данные имеют одну категорию для каждого наблюдения (ваш случай). Для других случаев (несколько категорий на одно наблюдение) весь вопрос должен быть изменен по-другому (поскольку у вас не может быть одной категории только в имени столбца).
Комментарии:
1. спасибо @vladmihaisima, но каждый раз алгоритм выполняет другую модификацию, например 0_yassine_ или 0_0yassine. я не понимаю, почему это так
2. Как правило, вам не нужны имена столбцов. Если вы хотите получить исходные категории, вы используете inverse_transform. Это может помочь иметь узнаваемые имена столбцов (например, для отладки), и вы можете изменить их, если хотите, или использовать другую библиотеку. Я соответствующим образом отредактировал ответ.