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

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.