按多列分组以查找重复行 pandas

36

我有一个 df

id    val1     val2
 1     1.1      2.2
 1     1.1      2.2
 2     2.1      5.5
 3     8.8      6.2
 4     1.1      2.2
 5     8.8      6.2

我想按val1和val2分组,并仅获取具有相同val1和val2组合的多个出现行的类似数据框。

最终的df

id    val1     val2
 1     1.1      2.2
 4     1.1      2.2
 3     8.8      6.2
 5     8.8      6.2
2个回答

69

你需要使用参数subsetduplicated,以指定要检查的列,使用keep=False来获取所有重复项,然后通过布尔索引进行掩码和过滤:

df = df[df.duplicated(subset=['val1','val2'], keep=False)]
print (df)
   id  val1  val2
0   1   1.1   2.2
1   1   1.1   2.2
3   3   8.8   6.2
4   4   1.1   2.2
5   5   8.8   6.2

详情:

print (df.duplicated(subset=['val1','val2'], keep=False))
0     True
1     True
2    False
3     True
4     True
5     True
dtype: bool

我该如何分组它们?我需要将id为[0,1,4]的数据分为一组。 - Venkata Gogu
@VenkataGogu - 使用 df.groupby('val1') - jezrael
@jezrael,您是指在duplicated之前还是之后进行groupby?能否请您将此内容添加到您的答案中? - KLaz
2
@KLaz - 你需要 df.groupby(['val1','val2'])['id'].agg(list).reset_index(name='new') 吗? - jezrael
@Klaz @VenkataGogu 如果我想要创建一个按它们分组的数据框,我会直接使用这个:df = df[df['val1', 'val2'].duplicated() == True].reset_index(drop=True) - Anna Christiane Kolandjian

0
另一种方法是计算组的大小,只保留其组大于1的行。
msk = df.groupby(['val1', 'val2'])['val1'].transform('size') > 1
df1 = df[msk]

res


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接