如何在pandas中以行或列的方式对数据框进行简单有效的洗牌?即如何编写一个函数shuffle(df, n, axis=0)
,该函数接受一个数据框,一定数量的洗牌次数n
,和轴(axis=0
表示行,axis=1
表示列),并返回一个被洗牌n
次后的数据框的副本。
编辑:关键是在不破坏数据框的行/列标签的情况下完成此操作。如果只是洗牌df.index
,那么将会失去所有这些信息。我希望结果df
与原始数据框相同,只是行或列的顺序不同。
编辑2:我的问题表述不清。当我说洗牌行时,我指的是分别对每行进行洗牌。因此,如果你有两列a
和b
,我希望每行都被独立地洗牌,这样你就不会像整个重排每行那样拥有对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)