Pandas で DataFrame 行をランダムにシャッフルする方法

Suraj Joshi 2023年1月30日
  1. Pandas の DataFrame 行をシャッフルする pandas.DataFrame.sample() メソッド
  2. numpy.random.permutation() は Pandas DataFrame 行をシャッフルする
  3. Pandas DataFrame 行をシャッフルするための sklearn.utils.shuffle()
Pandas で DataFrame 行をランダムにシャッフルする方法

Pandas の DataFrame オブジェクトの sample() メソッド、NumPy モジュールの permutation() 関数、sklearn パッケージの shuffle() 関数を使用して、Pandas の DataFrame 行をランダムにシャッフルできます。

Pandas の DataFrame 行をシャッフルする pandas.DataFrame.sample() メソッド

pandas.DataFrame.sample() を使用して、アイテムのランダムなサンプルを返すことができます DataFrame オブジェクトの軸から。行単位で要素をサンプリングする必要があるので、axis パラメーターを 0 に設定します。これは、axis パラメーターのデフォルト値です。

frac パラメータは、インスタンス全体のうち何を返す必要があるかを決定します。シャッフルしたい場合は、frac の値を 1 に設定します。

import pandas as pd

dates = ["April-10", "April-11", "April-12", "April-13"]
fruits = ["Apple", "Papaya", "Banana", "Mango"]
prices = [3, 1, 2, 4]

df = pd.DataFrame({"Date": dates, "Fruit": fruits, "Price": prices})
print(df)

df_shuffled = df.sample(frac=1).reset_index(drop=True)
print(df_shuffled)

出力:

       Date   Fruit  Price
0  April-10   Apple      3
1  April-11  Papaya      1
2  April-12  Banana      2
3  April-13   Mango      4
       Date   Fruit  Price
3  April-13   Mango      4
2  April-12  Banana      2
0  April-10   Apple      3
1  April-11  Papaya      1

上記のように、Dataframe.shuttle メソッドは Pandas DataFrame の行をシャッフルします。DataFrame 行のインデックスは、初期インデックスと同じままです。

reset_index() メソッドを追加して、DataFrame インデックスをリセットできます。

import pandas as pd

dates = ["April-10", "April-11", "April-12", "April-13"]
fruits = ["Apple", "Papaya", "Banana", "Mango"]
prices = [3, 1, 2, 4]

df = pd.DataFrame({"Date": dates, "Fruit": fruits, "Price": prices})
print(df)

df_shuffled = df.sample(frac=1).reset_index(drop=True)
print(df_shuffled)

出力:

       Date   Fruit  Price
0  April-10   Apple      3
1  April-11  Papaya      1
2  April-12  Banana      2
3  April-13   Mango      4
       Date   Fruit  Price
0  April-11  Papaya      1
1  April-13   Mango      4
2  April-10   Apple      3
3  April-12  Banana      2

ここで、drop=True オプションは、index 列が新しい列として追加されるのを防ぎます。

numpy.random.permutation() は Pandas DataFrame 行をシャッフルする

numpy.random.permutation() を使用して、DataFrame のインデックスをシャッフルできます。シャッフルされたインデックスを使用して、iloc() メソッドを使用して行を選択すると、ランダムにシャッフルされた行が取得されます。

import pandas as pd
import numpy as np

dates = ["April-10", "April-11", "April-12", "April-13"]
fruits = ["Apple", "Papaya", "Banana", "Mango"]
prices = [3, 1, 2, 4]

df = pd.DataFrame({"Date": dates, "Fruit": fruits, "Price": prices})

df_shuffled = df.iloc[np.random.permutation(df.index)].reset_index(drop=True)
print(df_shuffled)

出力:

       Date   Fruit  Price
0  April-13   Mango      4
1  April-12  Banana      2
2  April-10   Apple      3
3  April-11  Papaya      1

同じコードを実行すると、異なる結果が得られる場合があります。これは、np.random.permutation() 関数が毎回異なる数値の順列を生成するためです。

Pandas DataFrame 行をシャッフルするための sklearn.utils.shuffle()

sklearn.utils.shuffle() を使用して、Pandas DataFrame の行をシャッフルすることもできます。

import pandas as pd
import numpy as np
import sklearn

dates = ["April-10", "April-11", "April-12", "April-13"]
fruits = ["Apple", "Papaya", "Banana", "Mango"]
prices = [3, 1, 2, 4]

df = pd.DataFrame({"Date": dates, "Fruit": fruits, "Price": prices})

df_shuffled = sklearn.utils.shuffle(df)
print(df_shuffled)

出力:

       Date   Fruit  Price
3  April-13   Mango      4
0  April-10   Apple      3
1  April-11  Papaya      1
2  April-12  Banana      2

sklearn パッケージがインストールされていない場合は、次のスクリプトを使用してインストールできます。

pip install -U scikit-learn
著者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

関連記事 - Pandas DataFrame Row