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

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.