随机播放 DataFrame 行

新手上路,请多包涵

我有以下数据框:

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

我怎样才能做到这一点?

原文由 JNevens 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 501
2 个回答

使用 Pandas 执行此操作的惯用方法是使用数据框的 .sample 方法对所有行进行采样而不进行替换:

 df.sample(frac=1)

frac 关键字参数指定要在随机样本中返回的行的分数,所以 frac=1 表示返回所有行(以随机顺序)。


注意: 如果您希望就地改组您的数据框并重置索引,您可以执行例如

df = df.sample(frac=1).reset_index(drop=True)

在这里,指定 drop=True 可以防止 .reset_index 创建包含旧索引条目的列。

后续说明: 虽然上面的操作看起来可能不是 in-place ,但 python/pandas 足够聪明,不会为 shuffled 对象做另一个 malloc。也就是说,即使 引用 对象已更改(我的意思是 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)

原文由 Kris 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以简单地使用 sklearn 为此

from sklearn.utils import shuffle
df = shuffle(df)

原文由 tj89 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题