Skip to content

Pandas: Zufallsstichproben aus DataFrame mit sample()

Python

Sie können eine Zufallsstichprobe von pandas.DataFrame und Series mit der Methode sample() erhalten. Dies ist nützlich, um Daten in einer großen pandas.DataFrame-Serie zu überprüfen.

Dieser Artikel hat folgenden Inhalt.

  • Standardverhalten von sample()
  • Zeilen oder Spalten:axis
  • Die Anzahl der Zeilen und Spalten:n
  • Der Bruchteil von Zeilen und Spalten:frac
  • Der Seed für den Zufallszahlengenerator:random_state
  • Mit oder ohne Ersatz:replace
  • Index zurücksetzen:ignore_index, reset_index()

Verwenden Sie den Iris-Datensatz, der als Beispiel in Seaborn enthalten ist.

import pandas as pd
import seaborn as sns

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

Die folgenden Beispiele gelten für pandas.DataFrame, aber pandas.Series hat auch sample(). Die Verwendung ist für beide gleich.

Beachten Sie, dass SIE große pandas.DataFrame und Serie mit head() und tail() überprüfen can, sterben sterben erste/letzten n Zeilen zurückgeben.

Standardverhalten von sample()

Standardmäßig wird eine zufällige Zeile ausgewählt.

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

Zeilen oder Spalten:axis

Wenn der Achsenparameter auf 1 gesetzt IST, WIRD statt Einer Zeile zufällig eine Spalte ausgewählt.

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]

Die Anzahl der Zeilen und Spalten:n

Im Parameter n kann die Anzahl der zu selektierenden Zeilen oder Spalten angegeben werden.

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

Der Bruchteil von Zeilen und Spalten:frac

Der Anteil der zu selektierenden Zeilen und Spalten kann im Parameter frac angegeben werden. frac=1 bedeutet 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

Sie können n und frac nicht gleichzeitig angeben.

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

Der Seed für den Zufallszahlengenerator:random_state

Der Startwert für den Zufallszahlengenerator kann im Parameter random_state angegeben werden. Dieselben Zeilen/Spalten werden für den betrachteten random_state zurückgegeben.

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

Mit oder ohne Ersatz:replace

Wenn der Parameter replace auf True gesetzt ist, werden Zeilen und Spalten mit Ersetzung abgetastet. Dieselbe Zeile/Spalte kann wiederholt ausgewählt werden.

Der Standardwert für replace ist False (Sampling ohne Ersetzung).

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

If replace=True, can SIE einen Wert größer als die ursprüngliche Anzahl von Zeilen/Spalten in n oder einen Wert größer als 1 in frac angeben.

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

Index zurücksetzen:ignore_index, reset_index()

Wenn Sie das Ergebnis neu indizieren möchten (0, 1, … , n-1), setzen Sie den Parameter ignore_index von sample() auf 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

Derignore_index wurde in Pandas 1.3.0 hinzugefügt. Für frühere Versionen können Sie die Methode reset_index() verwenden. Setzen Sie den Drop-Parameter auf True, um den ursprünglichen Index zu löschen.

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