Dix méthodes de transformation et encodage de données avec Pandas

  1. Construire le jeu de données de test

Commençons par créer un dataframe exemple pour illustrer les différentes techniques d'encodage.

import pandas as pd
import numpy as np

# Génération d'un dataframe de démonstration
donnees = pd.DataFrame({
    'Statut': ['H', 'F', 'H', 'H', 'H', 'F', 'H', 'F', 'F', 'F'],
    'Module': ['Francais', 'C', 'Maths', 'Python', 'Java', 'PHP', 'Linux', 'SQL', 'Python', 'C++'],
    'Resultat': np.random.randint(0, 100, 10)
})
# Exemple de sortie :
#   Statut    Module  Resultat
# 0      H  Francais        45
# 1      F         C        82
# 2      H     Maths        67
# 3      H    Python        33
# 4      H      Java        78
# 5      F       PHP        91
# 6      H     Linux        12
# 7      F       SQL        56
# 8      F    Python        73
# 9      F       C++        28
  1. Fonction personnalisée avec itération

Utilisons une fonction dédiée pour catégoriser les résultats, appliquée via une boucle.

def categoriser_resultat(val):
    if val >= 90:
        return 'Excellent'
    elif 80 <= val < 90:
        return 'Bien'
    elif 70 <= val < 80:
        return 'Satisfaisant'
    elif 60 <= val < 70:
        return 'Passable'
    else:
        return 'Insuffisant'

donnees['Categorie'] = None
for idx in range(len(donnees)):
    donnees.iloc[idx, 3] = categoriser_resultat(donnees.iloc[idx, 2])
  1. Fonction personnalisée avec map

Appliquons la même fonction de manière plus efficace avec la méthode map.

donnees['Categorie_2'] = donnees['Resultat'].map(categoriser_resultat)
  1. Fonction personnalisée avec apply

Alternative utilisant apply avec une lambda, bien que cette approche puisse être moins performante pour de grands volumes de données.

donnees['Categorie_3'] = donnees['Resultat'].apply(
    lambda x: 'Excellent' if x >= 90 
    else ('Bien' if 80 <= x < 90 
    else ('Satisfaisant' if 70 <= x < 80 
    else ('Passable' if 60 <= x < 70 
    else 'Insuffisant')))
)
  1. Utilisation de pd.cut pour la segmentation

La fonction cut permet de diviser les données en intervalles prédéfinis.

seuils = [0, 59, 69, 79, 89, 100]
donnees['Categorie_4'] = pd.cut(donnees['Resultat'], seuils, labels=['Insuffisant', 'Passable', 'Satisfaisant', 'Bien', 'Excellent'])
  1. Binarisation avec scikit-learn

Transformons les scores en valeurs binaires en utilisant un seuil spécifique.

from sklearn.preprocessing import Binarizer

binariseur = Binarizer(threshold=60)
donnees['Resultat_binaire'] = binariseur.fit_transform(np.array(donnees['Resultat']).reshape(-1, 1))
  1. Encodage par remplacement avec replace

Convertissons des catégories textuelles en valeurs numériques via replace.

donnees['Statut_code'] = donnees['Statut'].replace(['H', 'F'], [0, 1])
  1. Conversion en dictionnaire avec value_counts

Créons un mapping basé sur la fréquence des valeurs pour encoder les modules.

frequence_modules = donnees['Module'].value_counts().index
carte_modules = {valeur: idx for idx, valeur in enumerate(frequence_modules)}
donnees['Module_code'] = donnees.replace({'Module': carte_modules})['Module']
  1. Encodage avec set et map

Générons un dictionnaire d'encodage à partir des valeurs uniques.

modules_uniques = set(donnees['Module'])
carte_encodage = {v: i for i, v in enumerate(modules_uniques)}
donnees['Module_code_2'] = donnees['Module'].map(carte_encodage)
  1. Conversion en type catégorie avec astype

Utilisons le type catégorie de pandas pour encoder automatiquement.

donnees['Module_categorie'] = donnees['Module'].astype('category')
donnees['Module_code_3'] = donnees['Module_categorie'].cat.codes
  1. Encodage avec LabelEncoder de scikit-learn

Appliquons l'encodeur de labels pour transformer des colonnes spécifiques.

from sklearn.preprocessing import LabelEncoder

encodeur1 = LabelEncoder()
encodeur1.fit(donnees['Statut'])
donnees['Statut_code_2'] = encodeur1.transform(donnees['Statut'])

encodeur2 = LabelEncoder()
donnees['Module_code_4'] = encodeur2.fit_transform(donnees['Module'])
  1. Encodage ordinal avec OrdinalEncoder

L'encodeur ordinal permet de transformer plusieurs colonnes simultanément.

from sklearn.preprocessing import OrdinalEncoder

encodeur_ordinal = OrdinalEncoder()
encodeur_ordinal.fit(donnees[['Statut', 'Module']])
donnees[['Statut_code_3', 'Module_code_5']] = encodeur_ordinal.transform(donnees[['Statut', 'Module']])
  1. Encodage séquentiel avec factorize

La méthode factorize attribue des codes basés sur l'ordre d'apparition des valeurs.

# Encodage basé sur l'ordre d'apparition
donnees['Module_code_6'] = pd.factorize(donnees['Module'])[0]

# Application sur plusieurs colonnes avec une lambda
colonnes_catégoriques = donnees.select_dtypes(['object']).columns
donnees[['Statut_code_4', 'Module_code_7']] = donnees[colonnes_catégoriques].apply(lambda x: pd.factorize(x)[0])

Étiquettes: Pandas Python Scikit-learn encodage-données transformation-données

Publié le 12 juillet à 19h25