2017-10-20 15 views
2

donc ma liste de str est:liste Convertir de str dans la liste des int

col = ['cat1','cat2','cat3'] 

Je veux convertir en liste d'int comme:

col = [0,1,2] 

J'ai essayé:

col=pd.Series(col) 
col=pd.to_numeric(col) 

Mais il donne une erreur:

Impossible d'analyser str ing "cat1" à la position 0

+1

Utiliser 'col = [i pour i, j enumerate (col)]' – Dark

+2

De quel type de conversion s'agit-il? Juste position? –

+0

Quel est le résultat souhaité si 'col = ['cat4', 'cat2', 'cat3', 'cat2']'? – jezrael

Répondre

5
In [4719]: pd.Series(col).astype('category').cat.codes 
Out[4719]: 
0 0 
1 1 
2 2 
dtype: int8 

Ou,

In [4726]: pd.Series(pd.factorize(col)[0]) 
Out[4726]: 
0 0 
1 1 
2 2 
dtype: int64 

Ou,

In [4738]: np.unique(col, return_inverse=True)[1] 
Out[4738]: array([0, 1, 2], dtype=int64) 

Ou,

In [4739]: pd.Categorical(col).codes 
Out[4739]: array([0, 1, 2], dtype=int8) 

utilisation .tolist() à la fin, si vous avez besoin d'une liste.

+0

Got it nice – Dark

+0

pd.Categorical, np.unique fonctionne sur le tri, pas pd.factorize par défaut. – Zero

+0

Comment se tromper de ce que OP a demandé? Correspond à ce qui a été demandé. Ni demandé des facteurs triés. – Zero

2

Utilisation factorize:

print (pd.factorize(col)[0].tolist()) 
[0, 1, 2] 

Sinon dupliquer des valeurs:

a = list(range(len(col))) 
[0, 1, 2] 

En outre, il travail bien si le changement col à:

col = ['cat4','cat2','cat3', 'cat2'] 
print (pd.factorize(col)[0].tolist()) 
[0, 1, 2, 1] 

obtenir également une sortie différente avec la deuxième solution:

col = ['cat4','cat2','cat3', 'cat2'] 
a = list(range(len(col))) 
print (a) 
[0, 1, 2, 3] 
1

Vous pouvez également utiliser groupby+ngroup-à-dire

col = ['cat1','cat2','cat3', 'cat2'] 
col=pd.Series(col) 

col.groupby(col).ngroup() 
 
0 0 
1 1 
2 2 
3 1 
dtype: int64 

Si vous avez besoin la liste puis

col.groupby(col).ngroup().tolist() 
[0, 1, 2, 1]