web-dev-qa-db-fra.com

Y a-t-il un moyen de mapper un encodeur d'étiquettes dans des pandas Python?

Je convertis des chaînes en valeurs catégoriques dans mon ensemble de données à l'aide du code suivant.

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

Pour, par exemple,

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

Après avoir encodé le jour de la semaine, mon ensemble de données apparaît comme suit:

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

Existe-t-il un moyen de savoir que dimanche a été cartographié à 3 h, mercredi à 6 h et ainsi de suite?

14
Gingerbread

La meilleure façon de procéder consiste à utiliser le codeur d’étiquette de la bibliothèque sklearn.

Quelque chose comme ça:

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]))
12
Algor Troy

Vous pouvez créer un dictionnaire supplémentaire avec un mappage:

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}
27
chinskiy

Une façon simple et élégante de faire la même chose.

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

et vous êtes terminé , vérifiez ci-dessous

print(encoded_data)
print(mapping_index)
print(mapping_index.get_loc("Mon"))
4
Abhishek

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

Selon 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 consiste à mapper directement les valeurs à l’aide de dict

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

Tout d’abord, faites une série catégorique:

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

Ensuite, inspectez ses "catégories":

weekdays.cat.categories.get_loc('Sun')
2
John Zwinck

Si vous avez les deux types de données numériques et catégoriques dans le cadre de données Vous pouvez utiliser: ici, X est mon cadre de données ayant les deux variables numériques et catégoriques.

from sklearn import preprocessing
le = preprocessing.LabelEncoder()

for i in range(0,X.shape[1]):
    if X.dtypes[i]=='object':
        X[X.columns[i]] = le.fit_transform(X[X.columns[i]])

Ou vous pouvez essayer ceci:

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
data = data.apply(le.fit_transform)

Remarque: cette technique est utile si vous ne souhaitez pas les reconvertir.

1
Vikas Gupta