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?.
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
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
Maintenant, vous avez plusieurs options ...
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)
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]]
DictVectorizer
de Scikit-learnfrom 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. ]])
get_dummies
Des Pandaspd.get_dummies(df)