Skip to content

pandas : Echantillonnage aléatoire à partir de DataFrame avec sample()

Vous pouvez obtenir un échantillon aléatoire de pandas.DataFrame et Series par la méthode sample(). Ceci est utile pour vérifier les données dans un grand pandas.DataFrame, Series.

Cet article décrit le contenu suivant.

  • Comportement par défaut de sample()
  • Lignes ou colonnes :axis
  • Le nombre de lignes et de colonnes :n
  • La fraction de lignes et de colonnes :frac
  • La graine du générateur de nombres aléatoires :random_state
  • Avec ou sans remplacement :replace
  • Réinitialiser l’index :ignore_index, reset_index()

Utilisez l’ensemble de données d’iris inclus comme échantillon dans Seaborn.

import pandas as pd
import seaborn as sns

df = sns.load_dataset("iris")
print(df.shape)
# (150, 5)

Les exemples suivants concernent pandas.DataFrame, mais pandas.Series a également sample(). L’utilisation est la même pour les deux.

Notez que vous pouvez vérifier pandas.DataFrame et Series de grande taille avec head() et tail(), qui renvoient les n premières/dernières lignes.

Comportement par défaut de sample()

Par défaut, une ligne est sélectionnée au hasard.

print(df.sample())
#      sepal_length  sepal_width  petal_length  petal_width    species
# 133           6.3          2.8           5.1          1.5  virginica

Lignes ou colonnes :axis

Si le paramètre d’axe est défini sur 1, une colonne est extraite de manière aléatoire au lieu d’une ligne.

print(df.sample(axis=1))
#      petal_width
# 0            0.2
# 1            0.2
# 2            0.2
# 3            0.2
# 4            0.2
# ..           ...
# 145          2.3
# 146          1.9
# 147          2.0
# 148          2.3
# 149          1.8
# 
# [150 rows x 1 columns]

Le nombre de lignes et de colonnes :n

Le nombre de lignes ou de colonnes à sélectionner peut être spécifié dans le paramètre n.

print(df.sample(n=3))
#     sepal_length  sepal_width  petal_length  petal_width     species
# 29           4.7          3.2           1.6          0.2      setosa
# 67           5.8          2.7           4.1          1.0  versicolor
# 18           5.7          3.8           1.7          0.3      setosa

La fraction de lignes et de colonnes :frac

La fraction de lignes et de colonnes à sélectionner peut être spécifiée dans le paramètre frac. frac=1 signifie 100 %.

print(df.sample(frac=0.04))
#      sepal_length  sepal_width  petal_length  petal_width     species
# 15            5.7          4.4           1.5          0.4      setosa
# 66            5.6          3.0           4.5          1.5  versicolor
# 131           7.9          3.8           6.4          2.0   virginica
# 64            5.6          2.9           3.6          1.3  versicolor
# 81            5.5          2.4           3.7          1.0  versicolor
# 137           6.4          3.1           5.5          1.8   virginica

Vous ne pouvez pas spécifier n et frac en même temps.

# print(df.sample(n=3, frac=0.04))
# ValueError: Please enter a value for `frac` OR `n`, not both

La graine du générateur de nombres aléatoires :random_state

La graine du générateur de nombres aléatoires peut être spécifiée dans le paramètre random_state. Les mêmes lignes/colonnes sont renvoyées pour le même random_state.

print(df.sample(n=3, random_state=0))
#      sepal_length  sepal_width  petal_length  petal_width     species
# 114           5.8          2.8           5.1          2.4   virginica
# 62            6.0          2.2           4.0          1.0  versicolor
# 33            5.5          4.2           1.4          0.2      setosa

print(df.sample(n=3, random_state=0))
#      sepal_length  sepal_width  petal_length  petal_width     species
# 114           5.8          2.8           5.1          2.4   virginica
# 62            6.0          2.2           4.0          1.0  versicolor
# 33            5.5          4.2           1.4          0.2      setosa

Avec ou sans remplacement :replace

Si le paramètre de remplacement est défini sur True, les lignes et les colonnes sont échantillonnées avec remplacement. La même ligne/colonne peut être sélectionnée à plusieurs reprises.

La valeur par défaut de replace est False (échantillonnage sans remplacement).

print(df.head(3))
#    sepal_length  sepal_width  petal_length  petal_width species
# 0           5.1          3.5           1.4          0.2  setosa
# 1           4.9          3.0           1.4          0.2  setosa
# 2           4.7          3.2           1.3          0.2  setosa

print(df.head(3).sample(n=3, replace=True))
#    sepal_length  sepal_width  petal_length  petal_width species
# 0           5.1          3.5           1.4          0.2  setosa
# 0           5.1          3.5           1.4          0.2  setosa
# 2           4.7          3.2           1.3          0.2  setosa

Si replace=True, vous pouvez spécifier une valeur supérieure au nombre original de lignes/colonnes dans n ou une valeur supérieure à 1 dans frac.

print(df.head(3).sample(n=5, replace=True))
#    sepal_length  sepal_width  petal_length  petal_width species
# 1           4.9          3.0           1.4          0.2  setosa
# 2           4.7          3.2           1.3          0.2  setosa
# 0           5.1          3.5           1.4          0.2  setosa
# 0           5.1          3.5           1.4          0.2  setosa
# 1           4.9          3.0           1.4          0.2  setosa

print(df.head(3).sample(frac=2, replace=True))
#    sepal_length  sepal_width  petal_length  petal_width species
# 2           4.7          3.2           1.3          0.2  setosa
# 1           4.9          3.0           1.4          0.2  setosa
# 2           4.7          3.2           1.3          0.2  setosa
# 2           4.7          3.2           1.3          0.2  setosa
# 0           5.1          3.5           1.4          0.2  setosa
# 2           4.7          3.2           1.3          0.2  setosa

Réinitialiser l’index :ignore_index, reset_index()

Si vous souhaitez réindexer le résultat (0, 1, … , n-1), définissez le paramètre ignore_index de sample() sur True.

print(df.sample(n=3, ignore_index=True))
#    sepal_length  sepal_width  petal_length  petal_width     species
# 0           5.2          2.7           3.9          1.4  versicolor
# 1           6.3          2.5           4.9          1.5  versicolor
# 2           5.7          3.0           4.2          1.2  versicolor

Le ignore_index a été ajouté dans pandas 1.3.0. Pour les versions antérieures, vous pouvez utiliser la méthode reset_index(). Définissez le paramètre drop sur True pour supprimer l’index d’origine.

print(df.sample(n=3).reset_index(drop=True))
#    sepal_length  sepal_width  petal_length  petal_width    species
# 0           4.9          3.1           1.5          0.2     setosa
# 1           7.9          3.8           6.4          2.0  virginica
# 2           6.3          2.8           5.1          1.5  virginica