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.0
signifie 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.4
sé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 |