随机播放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)