随机排列熊猫数据框中的行,将重复项保持在一起

时间:2019-03-07 15:46:06

标签: python pandas duplicates pandas-groupby shuffle

我有这样的数据:

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保留所有相同的行?

1 个答案:

答案 0 :(得分:2)

这里的代码可以实现您所要求的结果(不需要显式改组或排序,而只需将现有的df按A,B,C列分组):

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)更快,请在不需要默认排序的组时使用。