2017-02-13 3 views
5

Je convertis des chaînes en valeurs catégorielles dans mon ensemble de données en utilisant le code suivant.Un moyen d'obtenir des mappages d'un encodeur d'étiquettes en Python pandas?

data['weekday'] = pd.Categorical.from_array(data.weekday).labels 

Pour exemple,

index weekday 
0  Sunday 
1  Sunday 
2  Wednesday 
3  Monday 
4  Monday 
5  Thursday 
6  Tuesday 

Après codant pour le jour de la semaine, mon jeu de données apparaît comme ceci:

index weekday 
    0  3 
    1  3 
    2  6 
    3  1 
    4  1 
    5  4 
    6  5 

Est-il possible que je peux savoir ce dimanche a été cartographié à 3, Mercredi à 6 et ainsi de suite?

Répondre

7

La meilleure façon de le faire peut être d'utiliser l'encodeur d'étiquettes de bibliothèque sklearn.

Quelque chose comme ceci:

from sklearn import preprocessing 
le = preprocessing.LabelEncoder() 
le.fit(["paris", "paris", "tokyo", "amsterdam"]) 
list(le.classes_) 
le.transform(["tokyo", "tokyo", "paris"]) 
list(le.inverse_transform([2, 2, 1])) 
2

Tout d'abord, faire une série catégorique:

weekdays = pd.Series(['Sun', 'Sun', 'Wed', 'Mon', 'Mon']).astype('category') 

Ensuite, inspecter ses "catégories":

weekdays.cat.categories.get_loc('Sun') 
8

Vous pouvez créer le dictionnaire supplémentaire mapping:

from sklearn import preprocessing 
le = preprocessing.LabelEncoder() 
le.fit(data['name']) 
le_name_mapping = dict(zip(le.classes_, le.transform(le.classes_))) 
print(le_name_mapping) 
{'Tom': 0, 'Nick': 1, 'Kate': 2} 
1

Il y a plusieurs façons de le faire. Vous pouvez envisager pd.factorize, sklearn.preprocessing.LabelEncoder etc. Cependant, dans ce cas précis, vous avez deux options qui vous conviennent le mieux:

Aller par votre propre méthode, vous pouvez ajouter les catégories:

pd.Categorical(df.weekday, [ 
    'Sunday', 'Monday', 'Tuesday', 
    'Wednesday', 'Thursday', 'Friday', 
    'Saturday'] ).labels 

L'autre option est associé à des valeurs directement à l'aide d'un dict

df.weekday.map({ 
    'Sunday': 0, 
    'Monday': 1, 
    # ... and so on. You get the idea ... 
}) 
0

une façon élégante & simple à faire la même chose.

cat_list = ['Sun', 'Sun', 'Wed', 'Mon', 'Mon'] 
encoded_data, mapping_index = pd.Series(cat_list).factorize() 

et vous Dans le cas fait, vérifier ci-dessous

print(encoded_data) 
print(mapping_index) 
print(mapping_index.get_loc("Mon")) 
+0

vous ne savez pas quelles valeurs distinctes sont à venir dans les données, la création d'une liste de valeurs codées en dur pourrait fuir. LabelEncoder() traite cependant de tout ce qui arrive. – Himanshu