我有以下数据框:
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
表示返回所有行(以随机顺序)。
注意: 如果您希望就地打乱您的数据框并重置索引,您可以这样做,例如
df = df.sample(frac=1).reset_index(drop=True)
在这里,指定 drop=True
可防止 .reset_index
创建包含旧索引条目的列。
后续说明:虽然上面的操作可能看起来不像是就地,但python/pandas 足够聪明,不会再为shuffled 做一次malloc目的。也就是说,即使 reference 对象已更改(我的意思是 id(df_old)
与 id(df_new)
不同) ,底层的 C 对象还是一样的。为了证明确实如此,您可以运行一个简单的内存分析器:
$ python3 -m memory_profiler .\test.py
Filename: .\test.py
Line # Mem usage Increment Line Contents
================================================
5 68.5 MiB 68.5 MiB @profile
6 def shuffle():
7 847.8 MiB 779.3 MiB df = pd.DataFrame(np.random.randn(100, 1000000))
8 847.9 MiB 0.1 MiB df = df.sample(frac=1).reset_index(drop=True)
关于python - 随机播放 DataFrame 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29576430/