Skip to content

pandas: Campionamento casuale da DataFrame con sample()

Python

Puoi ottenere un campione casuale da pandas.DataFrame e Series con il metodo sample(). Questo è utile per controllare i dati in un pandas.DataFrame, Series di grandi dimensioni.

In questo articolo vengono descritti i seguenti contenuti.

  • Comportamento predefinito di campione()
  • Righe o colonne:axis
  • Il numero di righe e colonne:n
  • La frazione di righe e colonne:frac
  • Il seme per il generatore di numeri casuali:random_state
  • Con o senza sostituire:replace
  • Indice di ripristino:ignore_index, reset_index()

Usa il set di dati dell’iride incluso come campione in Seaborn.

import pandas as pd
import seaborn as sns

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

Gli esempi seguenti sono per pandas.DataFrame, ma pandas.Series ha anche sample(). L’utilizzo è lo stesso per entrambi.

Nota che puoi controllare pandas.DataFrame e Series di grandi dimensioni con head() e tail(), che restituiscono la prima/ultima n righe.

Comportamento predefinito di campione()

Per impostazione predefinita, una riga viene selezionata in modo casuale.

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

Righe o colonne:axis

Se il parametro dell’asse è impostato su 1, viene es casualmente una colonna anziché una riga.

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]

Il numero di righe e colonne:n

Il numero di righe da selezionare può essere specificato nel parametro 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 frazione di righe e colonne:frac

La frazione di righe e colonne da selezionare può essere specificata nel parametro frac. frac=1 significa 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

Non è possibile specificare ne frac contemporaneamente.

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

Il seme per il generatore di numeri casuali:random_state

Il seme per il generatore di numeri casuali può essere specificato nel parametro random_state. Le stesse righe/colonne vengono restituite per lo stesso 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

Con o senza sostituire:replace

Se il parametro di esecuzione è e le colonne impostate vengono te con la sostituzione. La stessa riga/colonna può essere selezionata più volte.

Il valore predefinito per la sostituzione è falso (campionamento senza sostituzione).

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

Se sostituire=True, puoi specificare un valore maggiore del numero di righe/colonne in no un valore maggiore di 1 in 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

Indice di ripristino:ignore_index, reset_index()

Se vuoi reindicizzare il risultato (0, 1, … , n-1), imposta il parametro ignore_index di sample() su 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

L’ignore_index è stato aggiunto in Pandas 1.3.0. Per le versioni precedenti, puoi utilizzare il metodo reset_index(). Impostare il parametro drop su True per eliminare l’indice originale.

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