超高頻度で使っているメソッドなのに、公式ドキュメントを読んだことがなかった、
pandas.DataFrame.sample
についてドキュメンを読んでみました。
元々の目的はデータ件数が不明なデータフレームからn個のサンプルが欲しい時に、
df.sample(n)
とすると、データフレームの件数が少ないとエラーになるのが面倒だし、
事前にlen(df)して、条件分岐するのが面倒なので都合のいいオプションを探していました。
df.sample(200)
# ValueError: Cannot take a larger sample than population when 'replace=False'
これを回避するために、いつも何かしら工夫をしていますが、正直無駄に行数が増えてる気がしています。
(コードのイメージ)
n = 200
if len(df) >= n:
df.sample(n)
else:
df
dfの行数がnより大きいならn件返して欲しくて、行数が少ないなら全部のデータをそのまま渡すというのを、
if文を使わずにsample()の引数で実現したかったわけです。
(結論からいうと、そのような引数は用意されていませんでした。)
エラーメッセージの指示に従ってreplace=True を設定すると、
同じ行が複数回サンプリングされるのを許すのでnが行数より大きくても大丈夫になります。
(ただ、これは自分が元々やりたかったのとは違う。)
dfを150行のデータフレームとすると次のような感じ。
print(len(df)) # 150
print(len(df.sample(200, replace=True))) # 200
目的のオプションは見つかりませんでしたが、その代わり、今まで知らなかった引数が使えることを知りました。
正確なステートメントは公式ドキュメントの方に任せて、ざっくりと書くと以下のようなものが使えます。
frac : サンプリングするデータの数を、個数ではなく割合で指定する。
replace : Trueにすると、同じデータを重複してサンプリングできる。
weights : サンプリングされる確率を重み付けできます。
random_state : 乱数固定。
axis : 1を指定すると、行ではなく列をサンプリングできる。
決定木系の機械学習モデルを自分で実装するときなどに便利そうですね。