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

Я пытаюсь преобразовать категориальные значения в двоичные значения с помощью pandas. Идея состоит в том, чтобы рассматривать каждое уникальное категориальное значение как характеристику (т. е. столбец) и присваивать 1 или 0 в зависимости от того, был ли конкретный объект (т. е. строка) отнесен к этой категории. Ниже приведен код:

data = pd.read_csv('somedata.csv')
converted_val = data.T.to_dict().values()
vectorizer = DV( sparse = False )
vec_x = vectorizer.fit_transform( converted_val )
numpy.savetxt('out.csv',vec_x,fmt='%10.0f',delimiter=',')

Мой вопрос: как сохранить преобразованные данные с именами столбцов?. В приведенном выше коде я могу сохранить данные с помощью функции numpy.savetxt, но это просто сохраняет массив, а имена столбцов теряются. В качестве альтернативы, есть ли более эффективный способ выполнить вышеуказанную операцию?


person Rkz    schedule 04.09.2015    source источник
comment
Возможно, pd.data.to_csv() будет работать лучше. Он имеет аргумент столбцов, который принимает последовательность и по умолчанию равен None.   -  person    schedule 04.09.2015


Ответы (2)


Кажется, вы используете scikit-learn DictVectorizer для преобразования категориальных значений в двоичные. В этом случае, чтобы сохранить результат вместе с новыми именами столбцов, вы можете создать новый DataFrame со значениями из vec_x и столбцами из DV.get_feature_names(). Затем сохраните DataFrame на диск (например, с to_csv()) вместо массива numpy.

В качестве альтернативы также можно использовать pandas для кодирования напрямую с помощью get_dummies функция:

import pandas as pd
data = pd.DataFrame({'T': ['A', 'B', 'C', 'D', 'E']})
res = pd.get_dummies(data)
res.to_csv('output.csv')
print res

Выход:

   T_A  T_B  T_C  T_D  T_E
0    1    0    0    0    0
1    0    1    0    0    0
2    0    0    1    0    0
3    0    0    0    1    0
4    0    0    0    0    1
person YS-L    schedule 04.09.2015
comment
Часто у вас будут бинарные переменные или какой-то предопределенный набор возможных значений (например, A, B, C, D, E), и в этом случае вы можете отбросить одну из переменных, например A в этом примере, потому что остальные 4 категории — это достаточная информация для уникальной идентификации каждого элемента: элемент 0 будет храниться как [-,0,0,0,0], сообщая вам, что элемент должен принадлежать A. Как это сделать: pd.get_dummies(data, drop_first=True) - person Mark; 29.06.2021

Вы имеете в виду "горячее" кодирование?

Скажем, у вас есть следующий набор данных:

import pandas as pd
df = pd.DataFrame([
            ['green', 1, 10.1, 0], 
            ['red', 2, 13.5, 1], 
            ['blue', 3, 15.3, 0]])

df.columns = ['color', 'size', 'prize', 'class label']
df

введите описание изображения здесь

Теперь у вас есть несколько вариантов...

А) Утомительный подход

color_mapping = {
           'green': (0,0,1),
           'red': (0,1,0),
           'blue': (1,0,0)}

df['color'] = df['color'].map(color_mapping)
df

введите описание изображения здесь

import numpy as np
y = df['class label'].values
X = df.iloc[:, :-1].values
X = np.apply_along_axis(func1d= lambda x: np.array(list(x[0]) + list(x[1:])), axis=1, arr=X)

print('Class labels:', y)
print('\nFeatures:\n', X)

Урожайность:

Class labels: [0 1 0]

Features:
 [[  0.    0.    1.    1.   10.1]
 [  0.    1.    0.    2.   13.5]
 [  1.    0.    0.    3.   15.3]]

B) DictVectorizer Scikit-learn

from sklearn.feature_extraction import DictVectorizer
dvec = DictVectorizer(sparse=False)

X = dvec.fit_transform(df.transpose().to_dict().values())
X

Урожайность:

array([[  0. ,   0. ,   1. ,   0. ,  10.1,   1. ],
       [  1. ,   0. ,   0. ,   1. ,  13.5,   2. ],
       [  0. ,   1. ,   0. ,   0. ,  15.3,   3. ]])

В) Панды get_dummies

pd.get_dummies(df)

введите описание изображения здесь

person Community    schedule 04.09.2015
comment
спасибо за подробное объяснение. Манекены - это именно то, что я искал. - person Rkz; 04.09.2015