我有以下数据框架:

    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文件中读取的。所有类型为1的行都在上面,然后是类型为2的行,然后是类型为3的行,等等。

我想打乱DataFrame的行顺序,这样所有的类型都是混合的。可能的结果是:

    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
...

我怎样才能做到这一点呢?


当前回答

以下是其中一种方法:

dataframe = dataframe.sample(frac=1, random_state=42).reset_index(drop=True)

在哪里

Frac =1表示数据帧的所有行

Random_state =42表示每次执行时保持相同的顺序

reset_index(drop=True)表示随机化数据帧的重新初始化索引

其他回答

(我没有足够的声誉来评论这篇文章,所以我希望别人能帮我。)有人担心第一种方法:

df.sample(frac=1)

它做了一个深度复制或者只是改变了数据框架。我运行以下代码:

print(hex(id(df)))
print(hex(id(df.sample(frac=1))))
print(hex(id(df.sample(frac=1).reset_index(drop=True))))

我的结果是:

0x1f8a784d400
0x1f8b9d65e10
0x1f8b9d65b70

这意味着该方法没有返回相同的对象,就像在上一个注释中建议的那样。所以这个方法确实会产生一个打乱的拷贝。

Shuffle pandas数据帧,在这种情况下,取一个样本数组索引,随机排序,然后将数组设置为数据帧的索引。现在根据索引对数据帧进行排序。这是你的洗牌数据帧

import random
df = pd.DataFrame({"a":[1,2,3,4],"b":[5,6,7,8]})
index = [i for i in range(df.shape[0])]
random.shuffle(index)
df.set_index([index]).sort_index()

输出

    a   b
0   2   6
1   1   5
2   3   7
3   4   8

在上面的代码中插入你的数据帧在我的地方。

没有numpy/sklean:),如果你想洗牌所有的值,但保持行和列的名称到位。

df_c = df.copy()
df_c.iloc[:,:] = df_c.sample(frac=1,random_state=123,ignore_index=True)

以下是其中一种方法:

dataframe = dataframe.sample(frac=1, random_state=42).reset_index(drop=True)

在哪里

Frac =1表示数据帧的所有行

Random_state =42表示每次执行时保持相同的顺序

reset_index(drop=True)表示随机化数据帧的重新初始化索引

这里有另一种方法:

df_shuffled = df.reindex(np.random.permutation(df.index))