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
Tox
fuente

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
YOBEN_S
fuente
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
Michael Gardner
fuente
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
ALollz
fuente