pandas.DataFrame, Seriesの行をランダムソート(シャッフル)

sample()メソッドを活用すると、pandas.DataFrame, pandas.Seriesの行をランダムに並び替える(シャッフルする)ことができます。他にも色々な方法があるが、sample()メソッドを使う方法は他のモジュールをインポートしたりする必要がないので便利。

pandas.DataFrame.sample — pandas 0.22.0 documentation

例として、以下のデータを使用します。

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

サンプルのcsvファイルはコチラ。

sample_pandas_normal.csv

例はpandas.DataFrameだが、pandas.Seriesでも同様のやり方でシャッフルできます。

sample()メソッドに引数frac=1を指定

sample()メソッドについての詳細は以下の記事参照。

引数frac=1とすると、すべての行数分のランダムサンプリングをすることになり、全体をランダムに並び替える(シャッフルする)ことに等しい。

df_s = df.sample(frac=1)
print(df_s)
#       name  age state  point
# 2  Charlie   18    CA     70
# 5    Frank   30    NY     57
# 4    Ellen   24    CA     88
# 1      Bob   42    CA     92
# 0    Alice   24    NY     64
# 3     Dave   68    TX     70

引数random_stateを指定すると乱数シードを固定できます。常に同じように並び替えられる。

df_s = df.sample(frac=1, random_state=0)
print(df_s)
#       name  age state  point
# 5    Frank   30    NY     57
# 2  Charlie   18    CA     70
# 1      Bob   42    CA     92
# 3     Dave   68    TX     70
# 0    Alice   24    NY     64
# 4    Ellen   24    CA     88

reset_index()メソッドでインデックス(行番号)を振り直す

reset_index()メソッドについての詳細は以下の記事参照。

reset_index()メソッドを使うと、シャッフルしたオブジェクトのインデックス(行番号)を振り直すことができます。元のインデックスを削除するために引数drop=Trueとします。

df_s = df.sample(frac=1).reset_index(drop=True)
print(df_s)
#       name  age state  point
# 0    Ellen   24    CA     88
# 1  Charlie   18    CA     70
# 2    Alice   24    NY     64
# 3     Dave   68    TX     70
# 4    Frank   30    NY     57
# 5      Bob   42    CA     92

元のオブジェクトを更新

この方法では元のオブジェクト自体を変更することはできないので、元のオブジェクトを更新したい場合は元のオブジェクトに代入して上書きします。

df = df.sample(frac=1).reset_index(drop=True)
print(df)
#       name  age state  point
# 0     Dave   68    TX     70
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3    Alice   24    NY     64
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

シェア

関連カテゴリー

Python pandas

pandasでstack, unstack, pivotを使ってデータを整形 pandasのインデックス参照で行・列を選択し取得 pandasの行・列をランダムサンプリング(抽出)するsample pandas参考書『Pythonによるデータ分析入門』の注意点 pandasでcsvファイルの書き出し・追記(to_csv) pandasで行・列の差分・変化率を取得するdiff, pct_change pandas.DataFrameから特定の型dtypeの列を抽出(選択) pandas.DataFrameに列や行を追加(assign, appendなど) pandas, Matplotlib(mpl_finance)でローソク足チャートを作成 pandas.DataFrame, SeriesとPython標準のリストを相互に変換 pandasで行・列ごとの最頻値を取得するmode pandasで欠損値NaNが含まれているか判定、個数をカウント Python, pandas, seabornでヒートマップを作成 pandasの文字列から正規表現で抽出して新たな列を生成 pandas.DataFrameを結合するmerge, join(列・インデックス基準)

Last Updated: 6/26/2019, 10:34:03 PM