Hướng dẫn get_dummies in python

answer

78

Hướng dẫn get_dummies in python

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_dummiescó 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 dfvớ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_dummiescho 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ỏi

Có thể bạn quan tâm

Tô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ẻ