1. ホーム
  2. python

[解決済み] pandasでDataFrameをシャッフル/置換する

2023-06-05 10:18:11

質問

pandasでデータフレームを行または列単位でシャッフルする簡単で効率的な方法は何ですか?すなわち、どのように関数を書くか shuffle(df, n, axis=0) を書き、データフレーム、シャッフルの数 n と軸( axis=0 は行である。 axis=1 は列)、シャッフルされたデータフレームのコピーを返します。 n 回シャッフルされたデータフレームのコピーを返します。

Edit : 重要なのは、データフレームの行/列ラベルを破壊することなくこれを行うことです。もし、ただシャッフルするだけなら df.index をシャッフルすると、その情報はすべて失われてしまいます。私は結果の df は、行の順序または列の順序が異なることを除いて、オリジナルと同じであることが必要です。

編集2 : 私の質問は不明瞭でした。私が行をシャッフルすると言ったとき、私は各行が独立してシャッフルすることを意味します。つまり、2つの列がある場合 ab の間に同じ関連付けがないように、それぞれの行を独自にシャッフルしてほしいのです。 ab のように、それぞれの行を全体として並べ替えるだけです。のようなものです。

for 1...n:
  for each col in df: shuffle column
return new_df

しかし、できれば素朴なループ処理よりも効率的であって欲しいものです。これは私にとってはうまくいきません。

def shuffle(df, n, axis=0):
        shuffled_df = df.copy()
        for k in range(n):
            shuffled_df.apply(np.random.shuffle(shuffled_df.values),axis=axis)
        return shuffled_df

df = pandas.DataFrame({'A':range(10), 'B':range(10)})
shuffle(df, 5)

どのように解決するのですか?

In [16]: def shuffle(df, n=1, axis=0):     
    ...:     df = df.copy()
    ...:     for _ in range(n):
    ...:         df.apply(np.random.shuffle, axis=axis)
    ...:     return df
    ...:     

In [17]: df = pd.DataFrame({'A':range(10), 'B':range(10)})

In [18]: shuffle(df)

In [19]: df
Out[19]: 
   A  B
0  8  5
1  1  7
2  7  3
3  6  2
4  3  4
5  0  1
6  9  0
7  4  6
8  2  8
9  5  9