Chuyển đổi nhiều cột phân loại


10

Trong tập dữ liệu của tôi, tôi có hai cột phân loại mà tôi muốn đánh số. Cả hai cột đều chứa các quốc gia, một số chồng chéo (xuất hiện trong cả hai cột). Tôi muốn cung cấp cùng một số trong cột1 và cột2 cho cùng một quốc gia.

Dữ liệu của tôi trông giống như:

import pandas as pd

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

Hiện tại tôi đang chuyển đổi dữ liệu như:

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

Tuy nhiên, điều này làm cho không có sự phân biệt giữa FR và ES. Có một cách đơn giản khác để đi đến đầu ra sau đây?

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

Câu trả lời:


8

Đây là một cách

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

Hoặc là

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

Bạn có thể điều chỉnh LabelEncoder () với các giá trị duy nhất trong khung dữ liệu của bạn trước rồi chuyển đổi.

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.uniquevới return_invesere. Mặc dù sau đó bạn cần xây dựng lại 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.