J'ai une base de données pandas avec des tonnes de colonnes catégorielles, que je prévois d'utiliser dans l'arbre de décision avec scikit-learn. J'ai besoin de les convertir en valeurs numériques (pas un seul vecteur chaud). Je peux le faire avec LabelEncoder de scikit-learn. Le problème est qu'il y en a trop et je ne veux pas les convertir manuellement.
Quel serait un moyen facile d'automatiser ce processus.
scikit-learn
pandas
categorical-data
labels
user1700890
la source
la source
Réponses:
Si vos colonnes catégorielles sont actuellement des caractères / objets, vous pouvez utiliser quelque chose comme ceci pour faire chacune:
Si vous avez besoin de pouvoir revenir aux catégories, je créerais un dictionnaire pour enregistrer l'encodage; quelque chose comme:
L'utilisation de la mcve de Julien produira:
la source
object
colonnes est très utile.Tout d'abord, créons un mcve pour jouer avec:
Nous pouvons maintenant utiliser pd.get_dummies pour encoder les trois premières colonnes.
Notez que j'utilise le
drop_first
paramètre parce que lesN-1
variables muettes sont suffisantes pour décrire complètement lesN
possibilités (par exemple: sia_Var2
eta_Var3
sont 0, alors c'esta_Var1
). De plus, je spécifie spécifiquement les colonnes mais je n'ai pas à le faire car ce seront des colonnes avec dtypeobject
oucategorical
(plus ci-dessous).Dans votre application spécifique, vous devrez fournir une liste de colonnes catégorielles ou vous devrez déduire quelles colonnes sont catégoriques.
Dans le meilleur des cas, votre trame de données a déjà ces colonnes avec un
dtype=category
et vous pouvez passercolumns=df.columns[df.dtypes == 'category']
àget_dummies
.Sinon, je suggère de définir la
dtype
de toutes les autres colonnes comme approprié (indice: pd.to_numeric, pd.to_datetime, etc.) et vous vous retrouverez avec des colonnes qui ont unobject
dtype et celles-ci devraient être vos colonnes catégorielles.La valeur par défaut des colonnes de paramètres pd.get_dummies est la suivante:
la source
Afin de convertir des types de plusieurs colonnes à la fois, j'utiliserais quelque chose comme ceci:
Je les rejoindrais ensuite
original df
.la source
df2[df2.columns] = df2[df2.columns].astype('category')
que c'est la même chose, nonapply
, nonlambda
.