如何用Pandas筛选表格中Column1和Column2组合重复的所有行?
解决Pandas中获取多列组合重复行的问题
问题场景
现有如下DataFrame df1:
import pandas as pd data = { 'Column1': ['cat', 'dog', 'cat', 'bird', 'cat', 'dog'], 'Column2': ['a', 'b', 'b', 'a', 'a', 'b'], 'Column3': [1, 4, 2, 3, 2, 3] } df1 = pd.DataFrame(data)
df1的内容:
Column1 Column2 Column3 0 cat a 1 1 dog b 4 2 cat b 2 3 bird a 3 4 cat a 2 5 dog b 3
需求是筛选出所有Column1和Column2组合重复的行,即这两列的取值组合出现过至少两次的所有行。
原代码的问题
你尝试的代码存在两个问题:
- 拼写错误:
duplecated应为duplicated; - 逻辑错误:用
Column1.isin(...) & Column2.isin(...)会误判——只要Column1在某个重复组合里、且Column2也在某个重复组合里,哪怕二者的组合本身不重复,也会被筛选出来。比如行2的(cat, b)仅出现一次,但因cat出现在重复组合(cat,a)中,b出现在重复组合(dog,b)中,所以被错误纳入结果。
正确解法
方法一:直接使用duplicated(keep=False)
duplicated(keep=False)会标记所有重复的行(包括首次出现的重复行),直接基于这个布尔索引筛选即可:
df1[df1[['Column1', 'Column2']].duplicated(keep=False)]
运行后得到期望的结果:
Column1 Column2 Column3 0 cat a 1 1 dog b 4 4 cat a 2 5 dog b 3
方法二:通过分组计数筛选
先计算每个Column1+Column2组合的出现次数,再筛选次数≥2的行:
# 统计每个组合的出现次数 group_counts = df1.groupby(['Column1', 'Column2']).size().reset_index(name='count') # 合并计数结果到原DataFrame,筛选次数≥2的行 result = df1.merge(group_counts, on=['Column1', 'Column2']).query('count >= 2').drop('count', axis=1)
此方法也能得到完全一致的正确结果。
内容的提问来源于stack exchange,提问作者Amr AlBarqawy
相关产品推荐
相关产品推荐

