シリーズやデータフレームの行をランダムにソートする場合は、Numpyのpermutation関数を使えば簡単にできる。
サンプルデータを用意する
まずはサンプルとなるデータフレームを用意しよう。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(5 * 4).reshape(5, 4))
# 0 1 2 3
# 0 0 1 2 3
# 1 4 5 6 7
# 2 8 9 10 11
# 3 12 13 14 15
# 4 16 17 18 19
これで5行4列のデータフレームが用意できた。
Numpyのrandom.permutation関数
それではNumpyのrandom.permutation関数を使って、サンプルのデータフレームをソートするコードを紹介していく。
まずは、random.permutation関数の動きから見ていこう。
sample_list = np.random.randn(5)
# [ 1.23678925 -0.81671551 0.38240228 1.90787974 0.80532073]
np.random.permutation(sample_list)
# array([ 0.38240228, 1.90787974, 0.80532073, 1.23678925, -0.81671551])
np.random.permutation(5)
# array([2, 4, 3, 0, 1])
5つの乱数からなるリストsample_listを用意し、random.permutation関数の引数に渡してみると、ランダムにソートした結果を返してくれる。
また、引数に整数を渡すと、渡した数を配列の長さとしランダムにソートした結果を返す。
次は実際にrandom.permutation関数を利用して、先ほど用意したサンプルのデータフレームを並び替える例を見てみる。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(5 * 4).reshape(5, 4))
# 0 1 2 3
# 0 0 1 2 3
# 1 4 5 6 7
# 2 8 9 10 11
# 3 12 13 14 15
# 4 16 17 18 19
sample = np.random.permutation(len(df))
# [0 2 3 4 1]
df.take(sample)
# 0 1 2 3
# 0 0 1 2 3
# 2 8 9 10 11
# 3 12 13 14 15
# 4 16 17 18 19
# 1 4 5 6 7
途中、len(df)というコードがあるが、これはデータフレームの行数を取得する関数なので、整数を指定するよりもこちらの方が適している。
また、take関数はランダムサンプリングの際に使う常套手段だ。
引数にインデックス番号で構成された配列を渡すと、与えられたインデックスの順にソートした結果を返してくれる。
df.take([4, 3, 2, 1])
# 0 1 2 3
# 4 16 17 18 19
# 3 12 13 14 15
# 2 8 9 10 11
# 1 4 5 6 7