Ubah beberapa kolom kategori

10

Dalam set data saya, saya memiliki dua kolom kategori yang ingin saya hitung. Kedua kolom keduanya berisi negara, beberapa tumpang tindih (muncul di kedua kolom). Saya ingin memberikan nomor yang sama di kolom1 dan kolom2 untuk negara yang sama.

Data saya terlihat seperti:

import pandas as pd

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

Saat ini saya sedang mengubah data seperti:

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

Namun ini tidak membuat perbedaan antara FR dan ES. Apakah ada cara sederhana lain untuk sampai pada hasil berikut?

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

Jawaban:

8

Ini satu cara

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

Atau

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

Anda bisa memasangkan LabelEncoder () dengan nilai-nilai unik di dalam dataframe Anda terlebih dahulu dan kemudian berubah.

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

np.uniquedengan return_invesere. Meskipun Anda kemudian harus merekonstruksi 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
sumber