随机排列 pandas 数据框中的行,将重复项放在一起

Shuffle rows in pandas dataframe, keeping duplicates together

我有这样的数据:

A  B  C  D  E  F
35 1  2  35 25 65
40 5  7  47 57 67
20 1  8  74 58 63
35 1  2  37 28 69
40 5  7  49 58 69
20 1  8  74 58 63
35 1  2  47 29 79
40 5  7  55 77 87
20 1  8  74 58 63

在这里我们可以看到 A、B 和 C 列的副本在不同的行中重复出现。我想打乱所有行并将副本放在连续的行中,而不删除它们中的任何一个。输出应如下所示:

A  B  C  D  E  F
35 1  2  35 25 65
35 1  2  37 28 69
35 1  2  47 29 79
40 5  7  47 57 67
40 5  7  49 58 69
40 5  7  55 77 87
20 1  8  74 58 63
20 1  8  74 58 63
20 1  8  74 58 63

当我使用 pandas.DataFrame.duplicated 时,它会给我重复的行。如何使用 groupby 保留所有相同的行?

这是实现您要求的结果的代码(不需要显式改组或排序,而只需按 A、B、C 列对现有 df 进行分组):

df_shuf = pd.concat( group[1] for group in df.groupby(['A','B','C'], sort=False) )

print(df_shuf.to_string(index=False))

A  B  C   D   E   F
35  1  2  35  25  65
35  1  2  37  28  69
35  1  2  47  29  79
40  5  7  47  57  67
40  5  7  49  58  69
40  5  7  55  77  87
20  1  8  74  58  63
20  1  8  74  58  63
20  1  8  74  58  63

备注:

  • 我不知道如何在分组对象上就地 df.reindex。但是没有它我们也能过得去。
  • 您不需要 pandas.DataFrame.duplicated,因为 df.groupby(['A','B','C'] 已经将所有重复项放在同一组中。
  • df.groupby(... sort=False) 更快,当您不需要默认排序的组时使用它。