Đầu tiên, hãy tạo một mcve để chơi với:
import pandas as pd
import numpy as np
In [1]: categorical_array = np.random.choice(['Var1','Var2','Var3'],
size=(5,3), p=[0.25,0.5,0.25])
df = pd.DataFrame(categorical_array,
columns=map(lambda x:chr(97+x), range(categorical_array.shape[1])))
# Add another column that isn't categorical but float
df['d'] = np.random.rand(len(df))
print(df)
Out[1]:
a b c d
0 Var3 Var3 Var3 0.953153
1 Var1 Var2 Var1 0.924896
2 Var2 Var2 Var2 0.273205
3 Var2 Var1 Var3 0.459676
4 Var2 Var1 Var1 0.114358
Bây giờ chúng ta có thể sử dụng pd.get_dummies để mã hóa ba cột đầu tiên.
Lưu ý rằng tôi đang sử dụng drop_first
tham số vì các hình N-1
nộm là đủ để mô tả đầy đủ các N
khả năng (ví dụ: nếu a_Var2
và bằng a_Var3
0, thì đó là a_Var1
). Ngoài ra, tôi đặc biệt chỉ định các cột nhưng tôi không phải vì nó sẽ là các cột có dtype object
hoặc categorical
(nhiều hơn bên dưới).
In [2]: df_encoded = pd.get_dummies(df, columns=['a','b', 'c'], drop_first=True)
print(df_encoded]
Out[2]:
d a_Var2 a_Var3 b_Var2 b_Var3 c_Var2 c_Var3
0 0.953153 0 1 0 1 0 1
1 0.924896 0 0 1 0 0 0
2 0.273205 1 0 1 0 1 0
3 0.459676 1 0 0 0 0 1
4 0.114358 1 0 0 0 0 0
Trong ứng dụng cụ thể của bạn, bạn sẽ phải cung cấp một danh sách các cột là Phân loại hoặc bạn sẽ phải suy ra các cột nào là Phân loại.
Kịch bản trường hợp tốt nhất khung dữ liệu của bạn đã có các cột này với một dtype=category
và bạn có thể chuyển columns=df.columns[df.dtypes == 'category']
đến get_dummies
.
dtype
Mặt khác, tôi khuyên bạn nên đặt tất cả các cột khác là phù hợp (gợi ý: pd.to_numeric, pd.to_datetime, v.v.) và bạn sẽ được để lại các cột có hình object
chữ nhật và đây sẽ là các cột phân loại của bạn.
Các cột tham số pd.get_dummies mặc định như sau:
columns : list-like, default None
Column names in the DataFrame to be encoded.
If `columns` is None then all the columns with
`object` or `category` dtype will be converted.