web-dev-qa-db-fra.com

Conversion de valeurs catégorielles en binaire à l'aide de pandas

J'essaie de convertir des valeurs catégorielles en valeurs binaires à l'aide de pandas. L'idée est de considérer chaque valeur catégorielle unique comme une entité (c'est-à-dire une colonne) et de mettre 1 ou 0 selon qu'un objet particulier (c'est-à-dire une ligne) a été attribué à cette catégorie. Voici le code:

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=',')

Ma question est de savoir comment enregistrer ces données converties avec les noms de colonne ?. Dans le code ci-dessus, je peux enregistrer les données en utilisant numpy.savetxt, mais cela enregistre simplement le tableau et les noms de colonne sont perdus. Sinon, existe-t-il un moyen beaucoup plus efficace d'effectuer l'opération ci-dessus?.

12
Rkz

Il semble que vous utilisiez DictVectorizer de scikit-learn pour convertir les valeurs catégorielles en binaire. Dans ce cas, pour stocker le résultat avec les nouveaux noms de colonne, vous pouvez construire un nouveau DataFrame avec des valeurs de vec_x Et des colonnes de DV.get_feature_names(). Ensuite, stockez le DataFrame sur le disque (par exemple avec to_csv()) au lieu du tableau numpy.

Alternativement, il est également possible d'utiliser pandas pour effectuer l'encodage directement avec la fonction 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

Production:

   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
11
YS-L

Vous voulez dire un codage "à chaud"?

Supposons que vous ayez le jeu de données suivant:

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

enter image description here

Maintenant, vous avez plusieurs options ...

A) L'approche fastidieuse

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

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

enter image description here

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)

Rendement:

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 de Scikit-learn

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

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

Rendement:

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 Des Pandas

pd.get_dummies(df)

enter image description here

18
user2489252