Introduction
Cet article explique comment mélanger les lignes et extraire des échantillons d’une DataFrame Pandas en utilisant la méthode sample, ainsi que le fonctionnement interne de ces opérations. Nous explorerons des exemples, comprendrons les mécanismes sous-jacents et recréerons même cette fonctionnalité à partir de zéro.
Génération d’un Jeu de Données Exemple
Commençons par créer une DataFrame simple à l'aide d'entiers aléatoires. Ce jeu de données servira de base à nos opérations d'échantillonnage.
1 2 3 4 5 6 7 | import numpy as np import pandas as pd data = np.random.randint(0, 100, (10, 2)) df = pd.DataFrame(data=data, columns=['Colonne A', 'Colonne B']) print(df) |
Exemple de sortie :
1 2 3 4 5 6 7 8 9 10 11 | Colonne A Colonne B 0 33 34 1 52 7 2 97 69 3 50 42 4 69 21 5 15 96 6 9 55 7 48 20 8 99 63 9 54 67 |
Utilisation de la Méthode sample
La méthode sample de Pandas offre un moyen simple de mélanger les lignes ou d'extraire un sous-ensemble de lignes d’une DataFrame.
Mélanger Toutes les Lignes
Pour mélanger toutes les lignes de la DataFrame :
1 | df.sample(frac=1.0) |
Exemple de sortie mélangée :
1 2 3 4 5 | Colonne A Colonne B 3 50 42 9 54 67 6 9 55 1 52 7 |
frac=1.0signifie que toutes les lignes sont sélectionnées, mais leur ordre est randomisé.
Échantillonner une Fraction des Lignes
Vous pouvez spécifier la fraction des lignes à échantillonner avec frac :
1 | df.sample(frac=0.4) |
Exemple de sortie :
1 2 3 | Colonne A Colonne B 4 69 21 6 9 55 |
- Ici,
frac=0.4sélectionne aléatoirement 40 % des lignes.
Ajouter une Graine pour la Reproductibilité
Pour obtenir des résultats cohérents, utilisez random_state pour définir une graine aléatoire :
1 | df.sample(frac=0.4, random_state=42) |
Exemple de sortie :
1 2 3 | Colonne A Colonne B 8 99 63 1 52 7 |
Réinitialiser l’Index
Réinitialiser l'index après échantillonnage garantit un index propre et séquentiel :
1 | df.sample(frac=0.4, random_state=42).reset_index(drop=True) |
Exemple de sortie :
1 2 3 | Colonne A Colonne B 0 99 63 1 52 7 |
Mélange avec NumPy
Bien que Pandas propose la méthode pratique sample, vous pouvez également utiliser NumPy pour un contrôle plus précis. Cette approche consiste à manipuler directement les indices du DataFrame.
Étape 1 : Récupérer les Indices du DataFrame
Commencez par extraire les indices de la DataFrame avec l'attribut index.values, ce qui renvoie un tableau des indices de ligne :
1 | df.index.values |
Sortie :
1 | array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) |
Étape 2 : Mélanger les Indices
Utilisez np.random.shuffle pour réorganiser ces indices aléatoirement sur place :
1 | np.random.shuffle(sampled_indices) |
Sortie :
1 | array([0, 9, 7, 2, 5, 4, 8, 6, 3, 1]) |
Étape 3 : Sélectionner un Sous-Ensemble des Indices (Optionnel)
Pour échantillonner seulement une fraction des lignes, découpez le tableau des indices mélangés. Par exemple, sélectionnez les 4 premières lignes des indices mélangés :
1 | sampled_indices = sampled_indices[:4] |
Sortie :
1 | array([0, 9, 7, 2]) |
Utiliser les Indices Mélangés pour Accéder aux Lignes
Enfin, utilisez la méthode .iloc pour récupérer les lignes correspondant aux indices mélangés :
1 | df.iloc[sampled_indices] |
Sortie :
1 2 3 4 5 | Colonne A Colonne B 0 33 34 9 54 67 7 48 20 2 97 69 |
Explications
np.random.shuffle: Réorganise aléatoirement les éléments d’un tableau sur place.iloc: Accède aux lignes par leur position entière dans le DataFrame, idéal pour travailler avec des indices mélangés personnalisés.
Recréation de la Méthode sample
Pour mieux comprendre le fonctionnement de sample, recréons-la :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | def sample_function(df, n=None, frac=None, replace=False, weights=None, random_state=None): # Déterminer le générateur aléatoire rng = np.random.default_rng(random_state) # Calculer le nombre d’échantillons if frac is not None: n_samples = int(len(df) * frac) elif n is not None: n_samples = n else: raise ValueError("`n` ou `frac` doit être spécifié.") # Générer des indices aléatoires sampled_indices = rng.choice( a=df.index, size=n_samples, replace=replace, p=weights ) # Retourner le DataFrame échantillonné return df.loc[sampled_indices] |
Exemple d’Utilisation
1 | sample_function(df, n=2) |
Sortie :
1 2 3 | Colonne A Colonne B 9 54 67 5 15 96 |
Références
| Liens | Site |
|---|---|
| pandas.DataFrame.sample | pandas.pydata.org |
| numpy.random.randint | numpy.org |
| numpy.random.shuffle | numpy.org |
