Transformieren Sie mehrere kategoriale Spalten

10

In meinem Datensatz habe ich zwei kategoriale Spalten, die ich nummerieren möchte. Die beiden Spalten enthalten beide Länder, einige überlappen sich (erscheinen in beiden Spalten). Ich möchte die gleiche Nummer in Spalte 1 und Spalte 2 für dasselbe Land angeben.

Meine Daten sehen ungefähr so ​​aus:

import pandas as pd

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

Derzeit transformiere ich die Daten wie folgt:

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

Dies macht jedoch keinen Unterschied zwischen FR und ES. Gibt es einen anderen einfachen Weg, um zur folgenden Ausgabe zu gelangen?

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

Antworten:

8

Hier ist ein Weg

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

Oder

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

Sie können den LabelEncoder () zuerst mit den eindeutigen Werten in Ihrem Datenrahmen versehen und dann transformieren.

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

np.uniquemit return_invesere. Dann müssen Sie jedoch den DataFrame rekonstruieren.

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
quelle