Comment Mélanger Aléatoirement les Lignes d'une DataFrame et Créer des Échantillons avec Pandas ?

Published: 03 mai 2021

Updated: 01 janvier 2025

Tags: Python; Pandas; DataFrame;

DMCA.com Protection Status

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