DataFrame や Series をシャッフルする場合、numpyの shuffle や permutation が使えそうです。でも、これをそのまま使うとインデックスが省かれてしまい 、値だけの ndarray になってしまいます。
インデックスやカラムを残して、都合よく一発でシャッフルするメソッドは残念ながらないようですが、permutation と take を使えば1行で簡単に書くことができます。
- 目次 -
スポンサーリンク
DataFrameの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
from pandas import DataFrame import numpy as np # # データ # df=DataFrame([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]], columns=['aa','bb','cc'],index=['AA','BB','CC','DD','EE']) #------------------ # aa bb cc # AA 1 2 3 # BB 4 5 6 # CC 7 8 9 # DD 10 11 12 # EE 13 14 15 #------------------ # # シャッフル # df.take(np.random.permutation(len(df))) #------------------ # aa bb cc # DD 10 11 12 # CC 7 8 9 # BB 4 5 6 # EE 13 14 15 # AA 1 2 3 #------------------ |
permutation と take の働き
permutation は 0 から 指定値-1 をランダムに並べ替えてくれます。
1 2 3 4 |
np.random.permutation(5) #------------------------ # array([4, 1, 0, 3, 2]) #------------------------ |
この数値は配列の添え字にそのまま使えます。
take は指定行を返してくれます。
1 2 3 4 5 6 |
df.take([1,4]) # aa bb cc #------------------------ # BB 4 5 6 # EE 13 14 15 #------------------------ |
Seriesの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
from pandas import Series # # データ # ss = Series([1,2,3,4,5], index=['AA','BB','CC','DD','EE']) #--------- # AA 1 # BB 2 # CC 3 # DD 4 # EE 5 #--------- # # シャッフル # ss.take(np.random.permutation(len(ss))) #--------- # BB 2 # CC 3 # AA 1 # DD 4 # EE 5 #--------- |