2 votes

Création d'une fonction pour normaliser les variables catégorielles (python)

Je ne sais pas s'il est correct de dire "normaliser" une chaîne de variables catégorielles, mais en gros, je veux créer une fonction pour mettre toutes les observations F ou f de la colonne ci-dessous à 0 et M ou m à 1 :

> df['gender']

gender
  f
  F
  f
  M
  M
  m

J'ai essayé ça :

def padroniza_genero(x):
    if(x == 'f' or x == 'F'):
        replace(['f', 'F'], 0)
    else:
        replace(1)

df1['gender'] = df1['gender'].apply(padroniza_genero)

Mais j'ai eu une erreur :

NameError: name 'replace' is not defined

Des idées ? Merci !

2voto

mozway Points 233

Il n'y a pas replace définie dans votre code.

Pour en revenir à votre objectif, utilisez une fonction vectorielle.

Convertir en inférieur et appliquer f->0, m->1 :

df['gender_num'] = df['gender'].str.lower().map({'f': 0, 'm': 1})

Ou utiliser une comparaison (pas égal à f) et une conversion de booléen en entier :

df['gender_num'] = df['gender'].str.lower().ne('f').astype(int)

sortie :

  gender  gender_num
0      f           0
1      F           0
2      f           0
3      M           1
4      M           1
5      m           1

généralisation

vous pouvez généraliser à un nombre infini de catégories en utilisant pandas.factorize . Avantage : vous obtiendrez un véritable Categorical type.

NB. le nombre de valeurs est fixé en fonction de la valeur qui vient en premier, ou par ordre lexicographique si sort=True :

s, key = pd.factorize(df['gender'].str.lower(), sort=True)
df['gender_num'] = s

key = dict(enumerate(key))
# {0: 'f', 1: 'm'}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X