Trasforma più colonne categoriali


10

Nel mio set di dati ho due colonne categoriche che vorrei numerare. Le due colonne contengono entrambe paesi, alcuni si sovrappongono (appaiono in entrambe le colonne). Vorrei dare lo stesso numero in colonna1 e colonna2 per lo stesso paese.

I miei dati sembrano in qualche modo:

import pandas as pd

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

Attualmente sto trasformando i dati come:

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

Tuttavia, ciò non fa alcuna distinzione tra FR ed ES. C'è un altro modo semplice per arrivare al seguente output?

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

Risposte:


8

Ecco un modo

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

È possibile adattare prima LabelEncoder () con i valori univoci nel proprio frame di dati, quindi trasformarli.

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. Tuttavia, è necessario ricostruire 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.