answer 78 Với gấu trúc 0,19 , bạn có thể làm điều đó trong một dòng duy nhất: pd.get_dummies(data=df, columns=['A', 'B'])
Columns chỉ định nơi thực hiện Mã hóa một nóng.
>>> df
A B C
0 a c 1
1 b c 2
2 a b 3
>>> pd.get_dummies(data=df, columns=['A', 'B'])
C A_a A_b B_b B_c
0 1 1.0 0.0 0.0 1.0
1 2 0.0 1.0 0.0 1.0
2 3 1.0 0.0 1.0 0.0
78 hữu ích 0 bình luận
chia sẻ answer 51 Kể từ phiên bản gấu trúc 0.15.0, pd.get_dummies có thể xử lý trực tiếp DataFrame (trước đó, nó chỉ có thể xử lý một Series duy nhất và xem bên dưới để biết cách giải quyết): In [1]: df = DataFrame({'A': ['a', 'b', 'a'], 'B': ['c', 'c', 'b'],
...: 'C': [1, 2, 3]})
In [2]: df
Out[2]:
A B C
0 a c 1
1 b c 2
2 a b 3
In [3]: pd.get_dummies(df)
Out[3]:
C A_a A_b B_b B_c
0 1 1 0 0 1
1 2 0 1 0 1
2 3 1 0 1 0
Giải pháp cho gấu trúc <0.15.0 Bạn có thể làm điều đó cho mỗi cột riêng biệt và sau
đó nối kết quả: In [111]: df
Out[111]:
A B
0 a x
1 a y
2 b z
3 b x
4 c x
5 a y
6 b y
7 c z
In [112]: pd.concat([pd.get_dummies(df[col]) for col in df], axis=1, keys=df.columns)
Out[112]:
A B
a b c x y z
0 1 0 0 1 0 0
1 1 0 0 0 1 0
2 0 1 0 0 0 1
3 0 1 0 1 0 0
4 0 0 1 1 0 0
5 1 0 0 0 1 0
6 0 1 0 0 1 0
7 0 0 1 0 0 1
Nếu bạn không muốn cột nhiều chỉ mục, hãy xóa cột keys=.. khỏi lệnh gọi hàm concat. 51 hữu ích 1 bình luận chia sẻ answer 5 Ai đó có thể có thứ gì đó thông minh hơn, nhưng đây là hai cách tiếp cận. Giả sử bạn có một khung dữ liệu được
đặt tên df với các cột 'Tên' và 'Năm' mà bạn muốn hình nộm. Đầu tiên, chỉ cần lặp lại các cột cũng không quá tệ: In [93]: for column in ['Name', 'Year']:
...: dummies = pd.get_dummies(df[column])
...: df[dummies.columns] = dummies
Một ý tưởng khác là sử dụng gói patsy , được thiết kế để xây dựng ma trận dữ liệu từ các công thức kiểu R. In [94]: patsy.dmatrix(' ~ C(Name) + C(Year)', df, return_type="dataframe")
5 hữu ích 0 bình luận chia sẻ answer 1 Trừ khi tôi không hiểu câu hỏi, nó được hỗ trợ nguyên bản trong get_dummies bằng cách chuyển đối số cột. 1 hữu ích 2 bình luận chia sẻ answer 0 Thủ thuật đơn giản mà tôi hiện đang sử dụng là vòng lặp for. Đầu tiên tách dữ liệu phân loại khỏi Khung dữ liệu bằng cách sử dụng select_dtypes(include="object") , sau đó bằng cách sử dụng vòng lặp for áp dụng get_dummies cho từng cột một cách lặp lại như tôi đã trình bày trong mã bên dưới: train_cate=train_data.select_dtypes(include="object")
test_cate=test_data.select_dtypes(include="object")
# vectorize catagorical data
for col in train_cate:
cate1=pd.get_dummies(train_cate[col])
train_cate[cate1.columns]=cate1
cate2=pd.get_dummies(test_cate[col])
test_cate[cate2.columns]=cate2
0 hữu ích 0 bình luận chia
sẻ Đăng nhập để trả lời câu hỏiCó thể bạn quan tâmTôi thực sự thích câu trả lời của Carl và đã ủng hộ nó. Tôi sẽ chỉ mở rộng ví dụ của Carl một chút để nhiều người hy vọng sẽ
đánh giá cao rằng pd.get_dummies có thể xử lý những điều chưa biết. Hai ví dụ dưới đây cho thấy rằng pd.get_dummies có thể thực hiện điều tương tự trong việc xử lý OHE không xác định. # data is from @dzieciou's comment above
>>> data =pd.DataFrame(pd.Series(['good','bad','worst','good', 'good', 'bad']))
# new_data has two values that data does not have.
>>> new_data= pd.DataFrame(
pd.Series(['good','bad','worst','good', 'good', 'bad','excellent', 'perfect']))
Sử dụng pd.get_dummies>>> df = pd.get_dummies(data)
>>> col_list = df.columns.tolist()
>>> print(df)
0_bad 0_good 0_worst
0 0 1 0
1 1 0 0
2 0 0 1
3 0 1 0
4 0 1 0
5 1 0 0
6 0 0 0
7 0 0 0
>>> new_df = pd.get_dummies(new_data)
# handle unknow by using .reindex and .fillna()
>>> new_df = new_df.reindex(columns=col_list).fillna(0.00)
>>> print(new_df)
# 0_bad 0_good 0_worst
# 0 0 1 0
# 1 1 0 0
# 2 0 0 1
# 3 0 1 0
# 4 0 1 0
# 5 1 0 0
# 6 0 0 0
# 7 0 0 0
Sử dụng OneHotEncoder>>> encoder = OneHotEncoder(handle_unknown="ignore", sparse=False)
>>> encoder.fit(data)
>>> encoder.transform(new_data)
# array([[0., 1., 0.],
# [1., 0., 0.],
# [0., 0., 1.],
# [0., 1., 0.],
# [0., 1., 0.],
# [1., 0., 0.],
# [0., 0., 0.],
# [0., 0., 0.]])
5 hữu ích 1 bình luận chia sẻ
|