Transformar múltiples columnas categóricas


10

En mi conjunto de datos tengo dos columnas categóricas que me gustaría numerar. Las dos columnas contienen países, algunos se superponen (aparecen en ambas columnas). Me gustaría dar el mismo número en la columna 1 y la columna 2 para el mismo país.

Mis datos se parecen a:

import pandas as pd

d = {'col1': ['NL', 'BE', 'FR', 'BE'], 'col2': ['BE', 'NL', 'ES', 'ES']}
df = pd.DataFrame(data=d)
df

Actualmente estoy transformando los datos como:

from sklearn.preprocessing import LabelEncoder
df.apply(LabelEncoder().fit_transform)

Sin embargo, esto no hace distinción entre FR y ES. ¿Hay otra forma simple de llegar a la siguiente salida?

o = {'col1': [2,0,1,0], 'col2': [0,2,4,4]}
output = pd.DataFrame(data=o)
output

Respuestas:


8

Aquí hay una manera

df.stack().astype('category').cat.codes.unstack()
Out[190]: 
   col1  col2
0     3     0
1     0     3
2     2     1
3     0     1

O

s=df.stack()
s[:]=s.factorize()[0]
s.unstack()
Out[196]: 
   col1  col2
0     0     1
1     1     0
2     2     3
3     1     3

5

Puede ajustar LabelEncoder () con los valores únicos en su marco de datos primero y luego transformarlos.

le = LabelEncoder()
le.fit(pd.concat([df.col1, df.col2]).unique()) # or np.unique(df.values.reshape(-1,1))

df.apply(le.transform)
Out[28]: 
   col1  col2
0     3     0
1     0     3
2     2     1
3     0     1

2

np.uniquecon return_invesere. Aunque luego necesita reconstruir el DataFrame.

pd.DataFrame(np.unique(df, return_inverse=True)[1].reshape(df.shape),
             index=df.index,
             columns=df.columns)

   col1  col2
0     3     0
1     0     3
2     2     1
3     0     1
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.