2015年12月12日

pandasのDataFrameのランダムソート

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