シリーズやデータフレームの行をランダムにソートする場合は、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