Преобразование категориальных значений в двоичные с помощью 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
функция, но это просто сохраняет массив, и имена столбцов теряются. Кроме того, существует ли эффективный способ выполнения вышеуказанной операции?.
2 ответов
похоже, что вы используете пакет scikit-узнать DictVectorizer
для преобразования категориальных значений в двоичные. В этом случае, чтобы сохранить результат вместе с новыми именами столбцов, вы можете создать новый фрейм данных со значениями из vec_x
и столбцов из DV.get_feature_names()
. Затем сохраните фрейм данных на диск (например, с помощью 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
вы имеете в виду кодировку "one-hot"?
скажем, у вас есть следующий набор данных:
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) Scikit-learn's DictVectorizer
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. ]])
C) Панды get_dummies
pd.get_dummies(df)