DataFrameのランダムソートをしようと思った時に、これまでは apply(lambda x: np.random.random()) みたいなことをしてランダムなカラムを作ってソートをしてたんだけど、もっといいやり方がStackOverFlow先生に良いやり方が書いてあった。
http://stackoverflow.com/questions/15772009/shuffling-permutating-a-dataframe-in-pandas
仮に下記のようなDataFrameがあったとする。
df = pd.DataFrame( (np.random.random(10) * 100).astype(np.int).reshape(5, 2), columns=['a', 'b'] ) #=> a b #=> 0 59 49 #=> 1 69 57 #=> 2 16 6 #=> 3 95 38 #=> 4 55 63
これをランダムソートする。np.random.permutation(df.index)でランダムな順列にして、reindexすればいいらしい。
df.reindex(np.random.permutation(df.index)) #=> a b #=> 2 16 6 #=> 4 55 63 #=> 3 95 38 #=> 0 59 49 #=> 1 69 57
なるほど。こんな風に書けるのか。
indexを振り直してshuffleした形跡を消してみる。
df.reindex(np.random.permutation(df.index)).reset_index(drop=True) #=> a b #=> 0 69 57 #=> 1 55 63 #=> 2 95 38 #=> 3 16 6 #=> 4 59 49