在熊猫中改组/排列DataFrame


问题内容

有什么简单有效的方法可以按行或按列对熊猫中的数据帧进行随机排序?即,如何编写一个函数shuffle(df, n, axis=0),该函数接受一个数据帧,大量随机播放n和一个轴(axis=0是行,axis=1是列),并返回已被随机播放n多次的数据帧的副本。

编辑
:关键是这样做而不破坏数据框的行/列标签。如果您只是随机播放df.index,则会丢失所有这些信息。df除了行顺序或列顺序不同之外,我希望结果与原始结果相同。

Edit2
:我的问题不清楚。当我说洗排时,是指独立洗排每一行。因此,如果您有两列ab,则我希望每一行都按其顺序进行随机排列,这样,您a和之间就不会具有相同的关联,b就好像您只是重新排列整个行的顺序一样。就像是:

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