小编典典

随机播放 DataFrame 行

all

我有以下数据框:

    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 的行,然后是有Type3的行,依此类推。

我想打乱 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
...

我怎样才能做到这一点?


阅读 149

收藏
2022-03-03

共1个答案

小编典典

使用 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)
2022-03-03