Pandas: convertir des catégories en nombres

Supposons que j'ai un dataframe avec des pays qui va comme:

cc | temp
US | 37.0
CA | 12.0
US | 35.0
AU | 20.0

Je sais qu'il y a un pd.fonction get_dummies pour convertir les pays en 'encodages à chaud'. Cependant, je souhaite les convertir en indices à la place de sorte que je vais obtenir cc_index = [1,2,1,3] à la place.

Je suppose qu'il existe un moyen plus rapide que d'utiliser les get_dummies avec une clause numpy where comme indiqué ci-dessous:

[np.where(x) for x in df.cc.get_dummies().values]

C'est un peu plus facile à faire dans R en utilisant 'factors' donc j'espère que les pandas ont quelque chose de semblable.

26
demandé sur jpp 2016-06-29 04:02:28

2 réponses

Tout d'abord, modifiez le type de la colonne:

df.cc = pd.Categorical(df.cc)

Maintenant, les données semblent similaires mais sont stockées catégoriquement. Pour capturer les codes de catégorie:

df['code'] = df.cc.cat.codes

Maintenant, vous avez:

   cc  temp  code
0  US  37.0     2
1  CA  12.0     1
2  US  35.0     2
3  AU  20.0     0

Si vous ne voulez pas modifier votre DataFrame mais simplement obtenir les codes:

df.cc.astype('category').cat.codes

Ou utilisez la colonne catégorique comme index:

df2 = pd.DataFrame(df.temp)
df2.index = pd.CategoricalIndex(df.cc)
54
répondu John Zwinck 2016-06-29 02:09:05

Si vous souhaitez seulement de transformer votre série en entier identifiants, vous pouvez utiliser pd.factorize.

Notez que cette solution, contrairement à pd.Categorical, ne sera pas triée par ordre alphabétique. Donc le premier pays sera attribué 0. Si vous souhaitez démarrer à partir de 1, vous pouvez ajouter une constante:

df['code'] = pd.factorize(df['cc'])[0] + 1

print(df)

   cc  temp  code
0  US  37.0     1
1  CA  12.0     2
2  US  35.0     1
3  AU  20.0     3

Si vous souhaitez trier par ordre alphabétique, spécifiez sort=True:

df['code'] = pd.factorize(df['cc'], sort=True)[0] + 1 
7
répondu jpp 2018-07-12 18:07:52