Transforme várias colunas categóricas

10

No meu conjunto de dados, tenho duas colunas categóricas que gostaria de numerar. As duas colunas contêm países, algumas se sobrepõem (aparecem nas duas colunas). Gostaria de fornecer o mesmo número na coluna1 e na coluna2 para o mesmo país.

Meus dados são parecidos com:

import pandas as pd

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

Atualmente estou transformando os dados como:

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

No entanto, isso não faz distinção entre FR e ES. Existe outra maneira simples de obter a seguinte saída?

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

Respostas:

8

Aqui está uma maneira

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

Ou

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
fonte
5

Você pode ajustar o LabelEncoder () com os valores exclusivos no seu dataframe primeiro e depois transformar.

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
fonte
2

np.uniquecom return_invesere. Embora você precise reconstruir o 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
fonte