我有这样的数据:
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
保留所有相同的行?
答案 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)
更快,请在不需要默认排序的组时使用。