Exemples de comment appliquer un encodage one-hot sur une colonne d'une dataframe avec pandas en utilisant get_dummies() ?
Créer deux dataframes avec pandas
Créons d'abord un faux jeu de données stocké dans une dataframe pandas :
import pandas as pd
import random
import numpy as np
categorical_data_1 = ['Paris', 'London', 'New-York', 'Berlin', 'Moscow']
categorical_data_2 = ['M', 'M', 'F', 'F', 'F']
data = np.arange(100)
data = data.reshape((25,4))
location_list = [random.choice(categorical_data_1) for i in range( data.shape[0] )]
meta_list = [random.choice(categorical_data_2) for i in range( data.shape[0] )]
label_list = [random.choice([0,1]) for i in range( data.shape[0] )]
df = pd.DataFrame(data,columns=['A','B','C','D'])
df['Location'] = location_list
df['Gender'] = meta_list
df['Label'] = label_list
print(df)
donne par exemple :
A B C D Location Gender Label
0 0 1 2 3 Moscow M 1
1 4 5 6 7 Berlin M 1
2 8 9 10 11 London F 0
3 12 13 14 15 New-York F 1
4 16 17 18 19 London M 0
5 20 21 22 23 Paris F 0
6 24 25 26 27 New-York F 1
7 28 29 30 31 New-York F 0
8 32 33 34 35 Paris M 1
9 36 37 38 39 London M 0
10 40 41 42 43 Moscow F 1
11 44 45 46 47 Moscow F 1
12 48 49 50 51 Moscow M 1
13 52 53 54 55 New-York M 1
14 56 57 58 59 Berlin M 1
15 60 61 62 63 New-York M 1
16 64 65 66 67 Moscow F 0
17 68 69 70 71 Berlin F 0
18 72 73 74 75 Berlin M 0
19 76 77 78 79 London F 0
20 80 81 82 83 New-York M 1
21 84 85 86 87 Moscow M 0
22 88 89 90 91 Moscow M 1
23 92 93 94 95 New-York F 0
24 96 97 98 99 New-York M 0
Fractionner la dataframe
Séparons le dataframe en deux dataframes :
df_train = df.sample(frac=0.8, random_state=42)
df_test = df.drop(df_train.index)
print(df_train)
print(df_test)
donne
A B C D Location Gender Label
8 32 33 34 35 Paris M 1
16 64 65 66 67 Moscow F 0
0 0 1 2 3 Moscow M 1
23 92 93 94 95 New-York F 0
11 44 45 46 47 Moscow F 1
9 36 37 38 39 London M 0
13 52 53 54 55 New-York M 1
1 4 5 6 7 Berlin M 1
22 88 89 90 91 Moscow M 1
5 20 21 22 23 Paris F 0
2 8 9 10 11 London F 0
12 48 49 50 51 Moscow M 1
15 60 61 62 63 New-York M 1
3 12 13 14 15 New-York F 1
4 16 17 18 19 London M 0
20 80 81 82 83 New-York M 1
17 68 69 70 71 Berlin F 0
21 84 85 86 87 Moscow M 0
18 72 73 74 75 Berlin M 0
24 96 97 98 99 New-York M 0
et
A B C D Location Gender Label
6 24 25 26 27 New-York F 1
7 28 29 30 31 New-York F 0
10 40 41 42 43 Moscow F 1
14 56 57 58 59 Berlin M 1
19 76 77 78 79 London F 0
respectivement
One-Hot Encoding avec pandas get_dummies()
Pour encoder des données catégorielles une solution est d'utiliser pandas.get_dummies:
df_train_e = pd.get_dummies(df_train, columns=['Location','Gender'], prefix=['Location','Gender'])
print(df_train_e)
donne
A B C D Label Location_Berlin Location_London Location_Moscow \
8 32 33 34 35 1 0 0 0
16 64 65 66 67 0 0 0 1
0 0 1 2 3 1 0 0 1
23 92 93 94 95 0 0 0 0
11 44 45 46 47 1 0 0 1
9 36 37 38 39 0 0 1 0
13 52 53 54 55 1 0 0 0
1 4 5 6 7 1 1 0 0
22 88 89 90 91 1 0 0 1
5 20 21 22 23 0 0 0 0
2 8 9 10 11 0 0 1 0
12 48 49 50 51 1 0 0 1
15 60 61 62 63 1 0 0 0
3 12 13 14 15 1 0 0 0
4 16 17 18 19 0 0 1 0
20 80 81 82 83 1 0 0 0
17 68 69 70 71 0 1 0 0
21 84 85 86 87 0 0 0 1
18 72 73 74 75 0 1 0 0
24 96 97 98 99 0 0 0 0
Location_New-York Location_Paris Gender_F Gender_M
8 0 1 0 1
16 0 0 1 0
0 0 0 0 1
23 1 0 1 0
11 0 0 1 0
9 0 0 0 1
13 1 0 0 1
1 0 0 0 1
22 0 0 0 1
5 0 1 1 0
2 0 0 1 0
12 0 0 0 1
15 1 0 0 1
3 1 0 1 0
4 0 0 0 1
20 1 0 0 1
17 0 0 1 0
21 0 0 0 1
18 0 0 0 1
24 1 0 0 1
Appliquer l'encodage à une autre dataframe
Voyons maintenant comment appliquer l'encodage à une autre dataframe(appelée df_test ici):
df_test_e = pd.get_dummies(df_test, columns=['Location','Gender'], prefix=['Location','Gender'])
df_test_e = df_test_e.reindex(columns = df_train_e.columns, fill_value=0)
print(df_test_e)
donne alors
A B C D Label Location_Berlin Location_London Location_Moscow \
6 24 25 26 27 1 0 0 0
7 28 29 30 31 0 0 0 0
10 40 41 42 43 1 0 0 1
14 56 57 58 59 1 1 0 0
19 76 77 78 79 0 0 1 0
Location_New-York Location_Paris Gender_F Gender_M
6 1 0 1 0
7 1 0 1 0
10 0 0 1 0
14 0 0 0 1
19 0 0 1 0
Références
- Scikit-Learn - one-hot encoding certain columns of a pandas dataframe
- One-Hot Encoding in Python with Pandas and Scikit-Learn
- Here’s All you Need to Know About Encoding Categorical Data (with Python code)
- One-hot encoding with
get_dummies()
- Encoding with Pandas get_dummies
- Easy way to apply transformation from
pandas.get_dummies
to new data? - pandas.get_dummies