按组随机排列熊猫数据框

Tes*_*est 5 python shuffle dataframe pandas

我的数据框看起来像这样

sampleID  col1 col2
   1        1   63
   1        2   23
   1        3   73
   2        1   20
   2        2   94
   2        3   99
   3        1   73
   3        2   56
   3        3   34
Run Code Online (Sandbox Code Playgroud)

我需要重新整理数据帧,使相同的样本保持在一起,并且col1的顺序必须与上述数据帧中的顺序相同。

所以我需要这样

sampleID  col1 col2
   2        1   20
   2        2   94
   2        3   99
   3        1   73
   3        2   56
   3        3   34
   1        1   63
   1        2   23
   1        3   73
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?如果我的例子不清楚,请告诉我。

sac*_*ruk 10

我发现这比接受的答案要快得多:

ids = df["sampleID"].unique()
random.shuffle(ids)
df = df.set_index("sampleID").loc[ids].reset_index()
Run Code Online (Sandbox Code Playgroud)

由于某种原因,这pd.concat是我的用例的瓶颈。不管怎样,你可以避免串联。


cs9*_*s95 7

假设您想改组sampleID。首先df.groupby,先随机播放(import random然后),然后调用pd.concat

import random

groups = [df for _, df in df.groupby('sampleID')]
random.shuffle(groups)

pd.concat(groups).reset_index(drop=True)

   sampleID  col1  col2
0         2     1    20
1         2     2    94
2         2     3    99
3         1     1    63
4         1     2    23
5         1     3    73
6         3     1    73
7         3     2    56
8         3     3    34
Run Code Online (Sandbox Code Playgroud)

使用重置索引df.reset_index(drop=True),但这是可选步骤。

  • @agcala random.shuffle 更适合打乱对象列表(dfs)。 (2认同)
  • @AMerii 迭代 grouoBy 产生一个(索引,组)的元组。由于我们不需要索引,因此我们可以使用“don't care var”_将其分配给它并且不对其执行任何操作。 (2认同)