随机排列 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)
更快,当您不需要默认排序的组时使用它。
我有这样的数据:
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)
更快,当您不需要默认排序的组时使用它。