てっきり専用のメソッドがあると思っていたら、無さそうだったのでやり方のメモです。
pandas のデータフレームのデータをランダムにシャッフルする方法を紹介します。
これを使う場面の一例ですが、たとえばkerasで作ったモデルを学習する時にvalidation_split を使う場合、
データをシャッフルせずに後ろの方から指定した割合をvalidationデータとして使うため、
事前にデータをシャッフルしておかないとtrainとvalidationでデータの傾向が違うということが発生し得ます。
参考:validation splitはどのように実行されますか?
pandasのデータフレームをランダムに混ぜ合わせる方法は何通りも考えらるのですが、
sample()
メソッドに、frac=1
を渡して実行するのが一番簡単そうです。
参考:DataFrameのsampleメソッドのドキュメントを読む
そうすることによって、データフレームの全ての行がサンプリングされ、さらに、sample()
の仕様により、データはシャッフルされます。
ついでにインデックスの振り直しまでやっておくと便利なので、次の例のように使うと良さそうです。
import pandas as pd
# サンプルデータ生成
df = pd.DataFrame(
{f"col{i}": [f"value{i}{j}" for j in range(10)] for i in range(3)}
)
print(df)
"""
col0 col1 col2
0 value00 value10 value20
1 value01 value11 value21
2 value02 value12 value22
3 value03 value13 value23
4 value04 value14 value24
5 value05 value15 value25
6 value06 value16 value26
7 value07 value17 value27
8 value08 value18 value28
9 value09 value19 value29
"""
# シャッフルしてインデックスを振り直す
df = df.sample(frac=1).reset_index(drop=True)
print(df)
"""
col0 col1 col2
0 value08 value18 value28
1 value06 value16 value26
2 value00 value10 value20
3 value03 value13 value23
4 value05 value15 value25
5 value02 value12 value22
6 value07 value17 value27
7 value04 value14 value24
8 value09 value19 value29
9 value01 value11 value21
"""