我有以下数据框:
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 文件中读取的。所有包含Type1 的行都位于顶部,其后是包含Type2 的行,然后是包含 3 的行Type,依此类推。
Type
我想打乱 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数据框的方法对所有行进行不重复采样:
.sample
df.sample(frac=1)
关键字frac参数指定随机样本中返回的行比例,因此frac=1意味着返回所有行(按随机顺序)。
frac
frac=1
注意: 如果您希望就地打乱数据框并重置索引,您可以这样做
df = df.sample(frac=1).reset_index(drop=True)
此处,指定drop=True防止.reset_index创建包含旧索引条目的列。
drop=True
.reset_index
后续说明:尽管上面的操作看起来可能不像是就地的,但 python/pandas 足够聪明,不会为混洗的对象执行另一个 malloc。也就是说,即使引用对象已更改(我的意思id(df_old)是与不同id(df_new)),底层 C 对象仍然相同。为了证明确实如此,您可以运行一个简单的内存分析器:
id(df_old)
id(df_new)
$ 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)