在pandas中对DataFrame进行洗牌/排列

13 浏览
0 Comments

在pandas中对DataFrame进行洗牌/排列

如何用简单高效的方式在pandas中对DataFrame进行行或列的洗牌?即如何编写一个函数shuffle(df, n, axis=0),该函数接受一个DataFrame、一个洗牌次数n和一个轴(axis=0表示行,axis=1表示列),并返回一个已经洗牌n次的DataFrame的副本。

编辑:关键是在不破坏DataFrame的行/列标签的情况下完成。如果只洗牌df.index,那么所有的信息都会丢失。我希望生成的df与原始的DataFrame相同,只是行的顺序或列的顺序不同。

编辑2:我的问题不太清楚。当我说洗牌行时,我的意思是独立地对每一行洗牌。所以如果你有两列ab,我希望每一行都独立地进行洗牌,这样就不会像整行重新排序那样存在ab之间的相互关联。类似于:

对于每一个 1...n:
  对于df的每一列:洗牌列
返回新的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)

0