TL;DR: np.random.shuffle(ndarray)可以完成这项工作。
所以,在你的情况下
np.random.shuffle(DataFrame.values)
DataFrame在底层使用NumPy ndarray作为数据持有者。(你可以从DataFrame源代码检查)
因此,如果使用np.random.shuffle(),它将沿着多维数组的第一个轴对数组进行洗牌。但是DataFrame的索引仍然没有被打乱。
不过,还是有几点需要考虑的。
函数返回none。如果您希望保留原始对象的副本,则必须在传递给函数之前这样做。
Sklearn.utils.shuffle(),正如用户tj89建议的那样,可以指定random_state和另一个选项来控制输出。您可能需要它用于开发目的。
Sklearn.utils.shuffle()更快。但是会将DataFrame的轴信息(索引,列)与它包含的ndarray一起SHUFFLE。
基准测试结果
在sklearn.utils.shuffle()和np.random.shuffle()之间。
ndarray
nd = sklearn.utils.shuffle(nd)
0.10793248389381915秒,快8倍
np.random.shuffle(nd)
0.8897626010002568秒
DataFrame
df = sklearn.utils.shuffle(df)
0.3183923360193148秒,快3倍
np.random.shuffle(df.values)
0.9357550159329548秒
结论:如果可以将轴信息(索引,列)与ndarray一起洗牌,请使用sklearn.utils.shuffle()。否则,使用np.random.shuffle()
使用代码
import timeit
setup = '''
import numpy as np
import pandas as pd
import sklearn
nd = np.random.random((1000, 100))
df = pd.DataFrame(nd)
'''
timeit.timeit('nd = sklearn.utils.shuffle(nd)', setup=setup, number=1000)
timeit.timeit('np.random.shuffle(nd)', setup=setup, number=1000)
timeit.timeit('df = sklearn.utils.shuffle(df)', setup=setup, number=1000)
timeit.timeit('np.random.shuffle(df.values)', setup=setup, number=1000)
pythonbenchmarking