对于一个数据帧,我如何将其随机化以使其真正地混合在一起?这样原始表中彼此相邻的行就不再在一起了。
例如,此表。
U A B C
0 1.438161 -0.210454 0
1 -0.283780 -0.371773 0
2 0.552564 -0.610548 0
3 1.931332 0.649179 1
4 1.656010 -1.373263 1
5 0.142682 -0.657849 1
6 1.754264 -0.610548 0
7 1.341232 0.649179 0
8 1.656010 -1.373263 0
9 0.944862 -0.657849 0
如何使它看起来像这样? (通过随机分组)
U A B C
1 -0.283780 -0.371773 0
3 1.931332 0.649179 1
0 1.438161 -0.210454 0
4 1.656010 -1.373263 1
8 1.656010 -1.373263 0
6 1.754264 -0.610548 0
2 0.552564 -0.610548 0
7 1.341232 0.649179 0
9 0.944862 -0.657849 0
5 0.142682 -0.657849 1
注意,第二个表中的索引号没有任何以连续顺序增加或减少的值(即,没有6、7或4,3)
这应该做您所需要的(真正随机意味着在一起之后的行可能仍然在一起):
df.sample(frac=1)
[frac
是要返回的结果的分数,1表示全部。
[此处有更多文档https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sample.html
您可以重新排列数据框中的每一列,然后合并结果。
np.random.seed(0)
>>> pd.concat([df[col].sample(frac=1).set_axis(df.index, axis=0) for col in df], axis=1)
U A B C
0 2 1.931332 -0.610548 0
1 8 0.142682 0.649179 0
2 4 -0.283780 -1.373263 0
3 9 0.552564 -1.373263 0
4 1 0.944862 -0.657849 0
5 6 1.656010 -0.371773 1
6 7 1.438161 -0.210454 0
7 3 1.754264 -0.610548 0
8 0 1.341232 -0.657849 1
9 5 1.656010 0.649179 1