pandasの行・列をランダムサンプリング(抽出)するsample

行数の多いpandas.DataFrame, pandas.Seriesのデータを確認するときに、行または列をランダムに抽出(ランダムサンプリング)するメソッドsample()が便利。

pandas.DataFrame.sample — pandas 0.22.0 documentation

例として、irisデータセットを使用します。 ここでは、seabornにサンプルとして含まれているデータを使います。pandas.DataFrameなのでそのまま使えて便利。

import pandas as pd
import seaborn as sns

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

例はpandas.DataFrameだが、pandas.Seriesでもsample()が用意されています。引数など、使い方は同じ。 なお、大きいサイズのpandas.DataFrame, pandas.Seriesのデータを確認するときに使えるほかのメソッドとして、先頭・末尾の行を返すhead()とtail()もあります。

sample()

引数を何も指定しないと、ランダムで1行が返される。

print(df.sample())
#      sepal_length  sepal_width  petal_length  petal_width    species
# 108           6.7          2.5           5.8          1.8  virginica

抽出する行数・列数を指定(引数n)

引数nで抽出する行数・列数を指定できます。

print(df.sample(n=3))
#     sepal_length  sepal_width  petal_length  petal_width     species
# 3            4.6          3.1           1.5          0.2      setosa
# 1            4.9          3.0           1.4          0.2      setosa
# 96           5.7          2.9           4.2          1.3  versicolor

抽出する行・列の割合を指定(引数frac)

引数fracで抽出する行・列の割合を指定できます。1だと100%。nとfracを同時に指定することは出来ない。

print(df.sample(frac=0.04))
#      sepal_length  sepal_width  petal_length  petal_width     species
# 119           6.0          2.2           5.0          1.5   virginica
# 97            6.2          2.9           4.3          1.3  versicolor
# 46            5.1          3.8           1.6          0.2      setosa
# 137           6.4          3.1           5.5          1.8   virginica
# 56            6.3          3.3           4.7          1.6  versicolor
# 62            6.0          2.2           4.0          1.0  versicolor

乱数シードを固定(引数random_state)

引数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

重複を許可(引数replace)

引数replaceをTrueとすると、抽出される行・列の重複が許可される。デフォルトはFalse。 replace=Trueの場合、元の行数・列数以上のサンプリング数を指定できます。

print(df.head(3).sample(n=3, 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
# 1           4.9          3.0           1.4          0.2  setosa

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
# 0           5.1          3.5           1.4          0.2  setosa
# 1           4.9          3.0           1.4          0.2  setosa
# 0           5.1          3.5           1.4          0.2  setosa
# 0           5.1          3.5           1.4          0.2  setosa

行・列を指定(引数axis)

引数axisを1とすると列をランダムに抽出できます。ここまでの例のように、デフォルトは0(行)。

print(df.head().sample(n=2, axis=1))
#    sepal_width species
# 0          3.5  setosa
# 1          3.0  setosa
# 2          3.2  setosa
# 3          3.1  setosa
# 4          3.6  setosa

シェア

関連カテゴリー

Python pandas

pandasのMultiindexの指定・追加・解除・ソート・レベル変更 pandasで数値を丸める(四捨五入、偶数への丸め) pandasのインデックス参照で行・列を選択し取得 pandasでカテゴリ変数をダミー変数に変換(get_dummies) pandasの文字列を区切り文字や正規表現で複数の列に分割 pandas.DataFrameの構造とその作成方法 pandasで最大値・最小値の行名・列名を取得するidxmax, idxmin Pythonのリストと配列とnumpy.ndarrayの違いと使い分け pandasでJSON文字列・ファイルを読み込み(read_json) pandasでデータを行・列(縦・横)方向にずらすshift pandasで時系列データをリサンプリングするresample, asfreq pandasでExcelファイル(xlsx, xls)の書き込み(to_excel) pandas-datareaderで株価や人口のデータを取得 pandas.DataFrame, SeriesとNumPy配列ndarrayを相互に変換 pandas参考書『Python for Data Analysis, 2nd Edition』

Last Updated: 6/26/2019, 10:34:03 PM