随机播放DataFrame行

我有以下的DataFrame:

Col1 Col2 Col3 Type 0 1 2 3 1 1 4 5 6 1 ... 20 7 8 9 2 21 10 11 12 2 ... 45 13 14 15 3 46 16 17 18 3 ... 

DataFrame是从csv文件中读取的。 所有具有Type 1的行位于顶部,接着是具有Type 2的行,接着是具有Type 3的行等。

我想洗牌DataFrame的行,以便所有Type的混合。 可能的结果可能是:

  Col1 Col2 Col3 Type 0 7 8 9 2 1 13 14 15 3 ... 20 1 2 3 1 21 10 11 12 2 ... 45 4 5 6 1 46 16 17 18 3 ... 

从结果可以看出,行的顺序是混洗的,但是列保持不变。 我不知道我是否清楚地解释这一点。 让我知道,如果我不知道。

我怎样才能做到这一点?

用pandas来做这种更习惯的方法是使用数据.sample方法,即

 df.sample(frac=1) 

frac关键字参数指定随机样本中要返回的行的比例,所以frac=1表示返回所有行(以随机顺序)。

注意: 如果你想在原地洗牌你的dataframe并重置索引,你可以做例如

 df = df.sample(frac=1).reset_index(drop=True) 

在这里,指定drop=True可防止.reset_index创build包含旧索引条目的列。

你可以简单地使用sklearn

 from sklearn.utils import shuffle df = shuffle(df) 

您可以通过索引混洗索引来混洗dataframe的行。 为此,你可以例如使用np.random.permutation (但np.random.choice也是一种可能性):

 In [12]: df = pd.read_csv(StringIO(s), sep="\s+") In [13]: df Out[13]: Col1 Col2 Col3 Type 0 1 2 3 1 1 4 5 6 1 20 7 8 9 2 21 10 11 12 2 45 13 14 15 3 46 16 17 18 3 In [14]: df.iloc[np.random.permutation(len(df))] Out[14]: Col1 Col2 Col3 Type 46 16 17 18 3 45 13 14 15 3 20 7 8 9 2 0 1 2 3 1 1 4 5 6 1 21 10 11 12 2 

如果你想保持索引编号从1,2,..,n在你的例子中,你可以简单地重置索引: df_shuffled.reset_index(drop=True)