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

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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.