Dans Pandas, la fonction ๐ฉโ๐โ.๐ โ๐โ๐ญโ_๐โ๐ฎโ๐ฆโ๐ฆโ๐ขโ๐โ๐ฌโ() convertit les variables catรฉgorielles en variables fictives.
Cette fonction peut convertir des donnรฉes classรฉes par chaรฎnes, comme le sexe, en un format tel que 0 pour homme et 1 pour femme. Elle peut รฉgalement transformer des entitรฉs multi-classes en une reprรฉsentation one-hot, une pratique courante dans le prรฉtraitement pour l’apprentissage automatique.
- Utilisation de base de ๐ฉโ๐โ.๐ โ๐โ๐ญโ_๐โ๐ฎโ๐ฆโ๐ฆโ๐ขโ๐โ๐ฌโ()
- Spรฉcifiez le type de donnรฉes pour les variables fictives : ๐โ๐ญโ๐ฒโ๐ฉโ๐โ
- Exclure la premiรจre catรฉgorie : ๐โ๐ซโ๐จโ๐ฉโ_๐โ๐ขโ๐ซโ๐ฌโ๐ญโ
- Convertir les valeurs manquantes N๐โN en variables fictives : ๐โ๐ฎโ๐ฆโ๐ฆโ๐ฒโ_๐งโ๐โ
- Spรฉcifiez les noms de colonnes pour les variables fictives : ๐ฉโ๐ซโ๐โ๐โ๐ขโ๐ฑโ , ๐ฉโ๐ซโ๐โ๐โ๐ขโ๐ฑโ_๐ฌโ๐โ๐ฉโ
- Spรฉcifiez les colonnes ร convertir en variables fictives : ๐โ๐จโ๐ฅโ๐ฎโ๐ฆโ๐งโ๐ฌโ
- Prรฉcautions ร prendre lors de la conversion de plusieurs donnรฉes avec ๐ฉโ๐โ.๐ โ๐โ๐ญโ_๐โ๐ฎโ๐ฆโ๐ฆโ๐ขโ๐โ๐ฌโ()
La version pandas utilisรฉe dans cet article est la suivante. Notez que les fonctionnalitรฉs peuvent varier selon les versions. Les donnรฉes suivantes sont utilisรฉes ร titre d’exemple. Des colonnes ont รฉtรฉ ajoutรฉes ร des fins d’explication.
import pandas as pd print(pd.__version__) # 2.1.2 df = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0) df['sex'] = ['female', float('nan'), 'male', 'male', 'female', 'male'] df['rank'] = [2, 1, 1, 0, 2, 0] print(df) # age state point sex rank # name # Alice 24 NY 64 female 2 # Bob 42 CA 92 NaN 1 # Charlie 18 CA 70 male 1 # Dave 68 TX 70 male 0 # Ellen 24 CA 88 female 2 # Frank 30 NY 57 male 0
Utilisation de base de ๐ฉโ๐โ.๐ โ๐โ๐ญโ_๐โ๐ฎโ๐ฆโ๐ฆโ๐ขโ๐โ๐ฌโ()
Le premier argument, ๐โ๐โ๐ญโ๐โ , de ๐ฉโ๐โ.๐ โ๐โ๐ญโ_๐โ๐ฎโ๐ฆโ๐ฆโ๐ขโ๐โ๐ฌโ() peut รชtre un objet de type tableau S๐โ๐ซโ๐ขโ๐โ๐ฌโ (comme une liste ou un tableau NumPy ๐งโ๐โ๐โ๐ซโ๐ซโ๐โ๐ฒโ ), ou un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ . Dans tous les cas, un nouveau D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ est renvoyรฉ.
Spรฉcifiez S๐โ๐ซโ๐ขโ๐โ๐ฌโ ou un objet de type tableau comme premier argument
Lorsqu’un objet S๐โ๐ซโ๐ขโ๐โ๐ฌโ ou de type tableau (tel qu’une liste ou un tableau NumPy ๐งโ๐โ๐โ๐ซโ๐ซโ๐โ๐ฒโ ) est spรฉcifiรฉ comme premier argument, les noms de catรฉgorie sont utilisรฉs comme noms de colonne.
print(pd.get_dummies(df['sex'])) # female male # name # Alice True False # Bob False False # Charlie False True # Dave False True # Ellen True False # Frank False True print(pd.get_dummies(['female', float('nan'), 'male', 'male', 'female', 'male'])) # female male # 0 True False # 1 False False # 2 False True # 3 False True # 4 True False # 5 False True
Spรฉcifiez D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ comme premier argument
Lorsqu’un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ est spรฉcifiรฉ comme premier argument, par dรฉfaut, les colonnes dont le type de donnรฉes ( ๐โ๐ญโ๐ฒโ๐ฉโ๐โ ) est ๐จโ๐โ๐ฃโ๐โ๐โ๐ญโ (principalement des chaรฎnes) ou ๐โ๐โ๐ญโ๐โ๐ โ๐จโ๐ซโ๐ฒโ sont toutes converties en variables factices. Les paramรจtres de conversion de colonnes d’autres types, comme les nombres, en variables factices sont abordรฉs plus loin.
Dans ce cas, les noms de colonnes rรฉsultantes suivent le format <ORIGINAL_COLUMN_NAME>_<CATEGORY_NAME> . Les paramรจtres permettant de modifier ce paramรจtre sont dรฉcrits plus loin.
print(pd.get_dummies(df)) # age point rank state_CA state_NY state_TX sex_female sex_male # name # Alice 24 64 2 False True False True False # Bob 42 92 1 True False False False False # Charlie 18 70 1 True False False False True # Dave 68 70 0 False False True False True # Ellen 24 88 2 True False False True False # Frank 30 57 0 False True False False True
Spรฉcifiez le type de donnรฉes pour les variables fictives : ๐โ๐ญโ๐ฒโ๐ฉโ๐โ
Par dรฉfaut, les variables fictives sont reprรฉsentรฉes par ๐โ๐จโ๐จโ๐ฅโ ( T๐ซโ๐ฎโ๐โ et F๐โ๐ฅโ๐ฌโ๐โ ).
Vous pouvez prรฉciser le type de donnรฉes avec l’argument ๐โ๐ญโ๐ฒโ๐ฉโ๐โ . รtant donnรฉ que T๐ซโ๐ฎโ๐โ et F๐โ๐ฅโ๐ฌโ๐โ sont dรฉfinis comme 1 et 0 respectivement, par exemple, indiquant ๐ขโ๐งโ๐ญโ les reprรฉsentent comme 1 et 0 .
print(pd.get_dummies(df, dtype=int)) # age point rank state_CA state_NY state_TX sex_female sex_male # name # Alice 24 64 2 0 1 0 1 0 # Bob 42 92 1 1 0 0 0 0 # Charlie 18 70 1 1 0 0 0 1 # Dave 68 70 0 0 0 1 0 1 # Ellen 24 88 2 1 0 0 1 0 # Frank 30 57 0 0 1 0 0 1
Exclure la premiรจre catรฉgorie : ๐โ๐ซโ๐จโ๐ฉโ_๐โ๐ขโ๐ซโ๐ฌโ๐ญโ
Lors de la conversion de ๐คโ catรฉgories en variables fictives, seules ๐คโ-1 variables fictives sont nรฉcessaires, mais par dรฉfaut, ๐ฉโ๐โ.๐ โ๐โ๐ญโ_๐โ๐ฎโ๐ฆโ๐ฆโ๐ขโ๐โ๐ฌโ() les convertit en ๐คโ variables fictives.
La dรฉfinition de l’argument ๐โ๐ซโ๐จโ๐ฉโ_๐โ๐ขโ๐ซโ๐ฌโ๐ญโ sur T๐ซโ๐ฎโ๐โ exclut la premiรจre catรฉgorie et la convertit en variables fictives ๐คโ-1 .
print(pd.get_dummies(df, drop_first=True)) # age point rank state_NY state_TX sex_male # name # Alice 24 64 2 True False False # Bob 42 92 1 False False False # Charlie 18 70 1 False False True # Dave 68 70 0 False True True # Ellen 24 88 2 False False False # Frank 30 57 0 True False True
Dans les donnรฉes d’exemple, la valeur S de B๐จโ๐โ est une valeur manquante N๐โN , et lorsque des variables fictives sont crรฉรฉes, ๐ฌโ๐โ๐ฑโ_๐โ๐โ๐ฆโ๐โ๐ฅโ๐โ et ๐ฌโ๐โ๐ฑโ_๐ฆโ๐โ๐ฅโ๐โ deviennent F๐โ๐ฅโ๐ฌโ๐โ . Notez que dรฉfinir ๐โ๐ซโ๐จโ๐ฉโ_๐โ๐ขโ๐ซโ๐ฌโ๐ญโ sur T๐ซโ๐ฎโ๐โ dans de tels cas entraรฎnerait la perte de l’information selon laquelle il s’agit de N๐โN . Pour convertir N๐โN en variables muettes, utilisez l’argument ๐โ๐ฎโ๐ฆโ๐ฆโ๐ฒโ_๐งโ๐โ prรฉsentรฉ ci-aprรจs.
Convertir les valeurs manquantes N๐โN en variables fictives : ๐โ๐ฎโ๐ฆโ๐ฆโ๐ฒโ_๐งโ๐โ
Par dรฉfaut, les valeurs manquantes N๐โN sont ignorรฉes et toutes les colonnes de variables factices deviennent F๐โ๐ฅโ๐ฌโ๐โ . Si vous souhaitez traiter N๐โN comme une catรฉgorie distincte pour les variables factices, dรฉfinissant l’argument ๐โ๐ฎโ๐ฆโ๐ฆโ๐ฒโ_๐งโ๐โ sur T๐ซโ๐ฎโ๐โ .
Pour les colonnes qui ne contiennent pas N๐โN , une colonne de variable factice pour N๐โN sera toujours ajoutรฉe et tous ses รฉlรฉments seront F๐โ๐ฅโ๐ฌโ๐โ .
print(pd.get_dummies(df, drop_first=True, dummy_na=True)) # age point rank state_NY state_TX state_nan sex_male sex_nan # name # Alice 24 64 2 True False False False False # Bob 42 92 1 False False False False True # Charlie 18 70 1 False False False True False # Dave 68 70 0 False True False True False # Ellen 24 88 2 False False False False False # Frank 30 57 0 True False False True False
Spรฉcifiez les noms de colonnes pour les variables fictives : ๐ฉโ๐ซโ๐โ๐โ๐ขโ๐ฑโ , ๐ฉโ๐ซโ๐โ๐โ๐ขโ๐ฑโ_๐ฌโ๐โ๐ฉโ
Pour une variable D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ , les noms de colonne par dรฉfaut pour les variables factices gรฉnรฉrรฉes sont <ORIGINAL_COLUMN_NAME>_<CATEGORY_NAME> . Vous pouvez modifier cela en spรฉcifiant les arguments ๐ฉโ๐ซโ๐โ๐โ๐ขโ๐ฑโ et ๐ฉโ๐ซโ๐โ๐โ๐ขโ๐ฑโ_๐ฌโ๐โ๐ฉโ .
L’argument ๐ฉโ๐ซโ๐โ๐โ๐ขโ๐ฑโ peut รชtre une chaรฎne, une liste ou un dictionnaire.
Si spรฉcifiรฉ sous forme de chaรฎne, tous les prรฉfixes seront identiques, comme <๐ฉโ๐ซโ๐โ๐โ๐ขโ๐ฑโ>_<CATEGORY_NAME> . Si vous souhaitez que les noms de colonnes des variables factices soient uniquement les noms de catรฉgorie, dรฉfinis ๐ฉโ๐ซโ๐โ๐โ๐ขโ๐ฑโ et ๐ฉโ๐ซโ๐โ๐โ๐ขโ๐ฑโ_๐ฌโ๐โ๐ฉโ sur une chaรฎne vide ย ยป .
print(pd.get_dummies(df, prefix='', prefix_sep='')) # age point rank CA NY TX female male # name # Alice 24 64 2 False True False True False # Bob 42 92 1 True False False False False # Charlie 18 70 1 True False False False True # Dave 68 70 0 False False True False True # Ellen 24 88 2 True False False True False # Frank 30 57 0 False True False False True
Vous pouvez dรฉfinir de nouveaux noms de colonnes sous forme de liste. Lorsque vous utilisez un dictionnaire pour ๐ฉโ๐ซโ๐โ๐โ๐ขโ๐ฑโ , mappez les noms de colonnes d’origine aux nouveaux en utilisant le format {๐จโ๐ซโ๐ขโ๐ โ๐ขโ๐งโ๐โ๐ฅโ_๐ โ๐จโ๐ฅโ๐ฎโ๐ฆโ๐งโ_๐งโ๐โ๐ฆโ๐โ : _๐งโ๐โ๐ฐโ_๐โ๐จโ๐ฅโ๐ฎ๐ฌโ๐๐งโ_๐งโ๐โ๐ฆโ๐โ} .
Une erreur se produit si le nombre d’รฉlรฉments dans la liste ou le dictionnaire ne correspond pas au nombre de colonnes ร convertir. Assurez-vous que chaque colonne ร convertir est prise en compte, mรชme si vous souhaitez conserver son nom d’origine.
print(pd.get_dummies(df, prefix=['ST', 'sex'], prefix_sep='-')) # age point rank ST-CA ST-NY ST-TX sex-female sex-male # name # Alice 24 64 2 False True False True False # Bob 42 92 1 True False False False False # Charlie 18 70 1 True False False False True # Dave 68 70 0 False False True False True # Ellen 24 88 2 True False False True False # Frank 30 57 0 False True False False True print(pd.get_dummies(df, prefix={'state': 'ST', 'sex': 'sex'}, prefix_sep='-')) # age point rank ST-CA ST-NY ST-TX sex-female sex-male # name # Alice 24 64 2 False True False True False # Bob 42 92 1 True False False False False # Charlie 18 70 1 True False False False True # Dave 68 70 0 False False True False True # Ellen 24 88 2 True False False True False # Frank 30 57 0 False True False False True
Spรฉcifiez les colonnes ร convertir en variables fictives : ๐โ๐จโ๐ฅโ๐ฎโ๐ฆโ๐งโ๐ฌโ
Par dรฉfaut, dans le cas d’un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ , les colonnes dont le type de donnรฉes ( ๐โ๐ญโ๐ฒโ๐ฉโ๐โ ) est ๐จโ๐โ๐ฃโ๐โ๐โ๐ญโ (principalement des chaรฎnes) ou ๐โ๐โ๐ญโ๐โ๐ โ๐จโ๐ซโ๐ฒโ sont convertis en variables factices.
Vous pouvez รฉgalement convertir des colonnes numรฉriques et boolรฉennes en variables factices en spรฉcifiant les noms de colonnes sous forme de liste dans l’argument ๐โ๐จโ๐ฅโ๐ฎโ๐ฆโ๐งโ๐ฌโ . Les colonnes non spรฉcifiรฉes dans ๐โ๐จโ๐ฅโ๐ฎโ๐ฆโ๐งโ๐ฌโ ne sont pas converties.
print(pd.get_dummies(df, columns=['sex', 'rank'])) # age state point sex_female sex_male rank_0 rank_1 rank_2 # name # Alice 24 NY 64 True False False False True # Bob 42 CA 92 False False False True False # Charlie 18 CA 70 False True False True False # Dave 68 TX 70 False True True False False # Ellen 24 CA 88 True False False False True # Frank 30 NY 57 False True True False False
Prรฉcautions ร prendre lors de la conversion de plusieurs donnรฉes avec ๐ฉโ๐โ.๐ โ๐โ๐ญโ_๐โ๐ฎโ๐ฆโ๐ฆโ๐ขโ๐โ๐ฌโ()
Soyez prudent lorsque vous convertissez plusieurs donnรฉes avec ๐ฉโ๐โ.๐ โ๐โ๐ญโ_๐โ๐ฎโ๐ฆโ๐ฆโ๐ขโ๐โ๐ฌโ() .
Considรฉrez les deux D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ๐ฌโ suivants .
df = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0) df_A, df_B = df[:3].copy(), df[3:].copy() print(df_A) # age state point # name # Alice 24 NY 64 # Bob 42 CA 92 # Charlie 18 CA 70 print(df_B) # age state point # name # Dave 68 TX 70 # Ellen 24 CA 88 # Frank 30 NY 57
La conversion de chacune d’entre elles avec ๐ฉโ๐โ.๐ โ๐โ๐ญโ_๐โ๐ฎโ๐ฆโ๐ฆโ๐ขโ๐โ๐ฌโ() donne le rรฉsultat suivant. รtant donnรฉ que chaque donnรฉe contient des catรฉgories diffรฉrentes, les colonnes rรฉsultantes diffรจrent.
print(pd.get_dummies(df_A)) # age point state_CA state_NY # name # Alice 24 64 False True # Bob 42 92 True False # Charlie 18 70 True False print(pd.get_dummies(df_B)) # age point state_CA state_NY state_TX # name # Dave 68 70 False False True # Ellen 24 88 True False False # Frank 30 57 False True False
Pour rendre les colonnes de variables factices communes, utilisez le type catรฉgorique de pandas. Convertissez les colonnes cibles en type catรฉgorique ร l’aide de ๐ฉโ๐โ.C๐โ๐ญโ๐โ๐ โ๐จโ๐ซโ๐ขโ๐โ๐โ๐ฅโ() .
- Donnรฉes catรฉgorielles โ documentation pandas 2.1.3
- pandas.Categorical โ documentation de pandas 2.1.3
- Demande de fonctionnalitรฉ : autoriser les catรฉgories dรฉfinies par l’utilisateur dans get_dummies ยท Problรจme nยฐ 22078 ยท pandas-dev/pandas
categories = set(df_A['state'].tolist() + df_B['state'].tolist()) print(categories) # {'NY', 'TX', 'CA'} df_A['state'] = pd.Categorical(df_A['state'], categories) df_B['state'] = pd.Categorical(df_B['state'], categories) print(df_A['state'].dtypes) # category
Ici, les catรฉgories sont gรฉnรฉrรฉes en convertissant chaque colonne en une liste avec ๐ญโ๐จโ๐ฅโ๐ขโ๐ฌโ๐ญโ() , en concatรฉnant ces listes, puis en supprimant les doublons avec ๐ฌโ๐โ๐ญโ() .
- Convertir pandas.DataFrame, Series et lister les uns vers les autres
- Supprimer/extraire les รฉlรฉments en double de la liste en Python
Lorsque ๐ฉโ๐โ.๐ โ๐โ๐ญโ_๐โ๐ฎโ๐ฆโ๐ฆโ๐ขโ๐โ๐ฌโ() est exรฉcutรฉe sur ces variables, des variables factices sont gรฉnรฉrรฉes en fonction des catรฉgories spรฉcifiques. Par exemple, la colonne ๐ฌโ๐ญโ๐โ๐ญโ๐โ dans ๐โ๐โ_A ne contient pas TX , mais une colonne ๐ฌโ๐ญโ๐โ๐ญโ๐โ_TX est lancรฉe.
print(pd.get_dummies(df_A)) # age point state_NY state_TX state_CA # name # Alice 24 64 True False False # Bob 42 92 False False True # Charlie 18 70 False False True print(pd.get_dummies(df_B)) # age point state_NY state_TX state_CA # name # Dave 68 70 False True False # Ellen 24 88 False False True # Frank 30 57 True False False
Bien que les catรฉgories de l’exemple ci-dessus incluent des valeurs provenant d’au moins un des ensembles de donnรฉes, vous pouvez รฉgalement dรฉfinir vos propres catรฉgories, y compris des valeurs non prรฉsentes dans les ensembles de donnรฉes. Les valeurs ne correspondant pas ร une catรฉgorie sont traitรฉes comme N๐โN .
categories = ['CA', 'NY'] df_A['state'] = pd.Categorical(df_A['state'], categories) df_B['state'] = pd.Categorical(df_B['state'], categories) print(df_A) # age state point # name # Alice 24 NY 64 # Bob 42 CA 92 # Charlie 18 CA 70 print(df_B) # age state point # name # Dave 68 NaN 70 # Ellen 24 CA 88 # Frank 30 NY 57 print(pd.get_dummies(df_A)) # age point state_CA state_NY # name # Alice 24 64 False True # Bob 42 92 True False # Charlie 18 70 True False print(pd.get_dummies(df_B)) # age point state_CA state_NY # name # Dave 68 70 False False # Ellen 24 88 True False # Frank 30 57 False True
