python - 随机播放 DataFrame 行

标签 python pandas dataframe permutation shuffle

我有以下数据框:

    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/

相关文章:

python - 水印两个 pdf - 第一个的每一页和第二个的每一页

python - 最小示例 opencv、pyinstaller、conda

python - 如何从数据框中的列中提取强标签并附加或替换该单元格?

python - Pandas DataFrame 在 groupby 之后添加列

python - 从 pandas 的 2 个数据框中添加 2 列

Python:删除数据框中除 > < 之间的信息之外的所有字符串

python - 如何在 VS Code 和 Ubuntu 中使用 Keras 模块运行 python 代码?

python - 如何从 python 中的命名元组中获取名称?

python - While Loop 和 Pandas Iterrows

python - 使用 df.merge 填充 df 中的新列给出奇怪的匹配项