在熊猫数据框中查找重复行

Posted

技术标签:

【中文标题】在熊猫数据框中查找重复行【英文标题】:find duplicate rows in a pandas dataframe 【发布时间】:2018-04-21 05:10:21 【问题描述】:

我正在尝试在 pandas 数据框中查找重复行。

df=pd.DataFrame(data=[[1,2],[3,4],[1,2],[1,4],[1,2]],columns=['col1','col2'])

df
Out[15]: 
   col1  col2
0     1     2
1     3     4
2     1     2
3     1     4
4     1     2

duplicate_bool = df.duplicated(subset=['col1','col2'], keep='first')
duplicate = df.loc[duplicate_bool == True]

duplicate
Out[16]: 
   col1  col2
2     1     2
4     1     2

有没有办法添加引用第一个副本(保留的那个)的索引的列

duplicate
Out[16]: 
   col1  col2  index_original
2     1     2               0
4     1     2               0

注意:在我的情况下,df 可能非常大....

【问题讨论】:

如果有 3 个重复项怎么办? 好点!我编辑了问题 您能否为不同的重复项添加输出而不是仅一个。 @gabboshow 如果答案有帮助,将不胜感激您的投票和接受。谢谢。 如果我有 90 列怎么办? 【参考方案1】:

使用groupby,新建一列索引,然后调用duplicated

df['index_original'] = df.groupby(['col1', 'col2']).col1.transform('idxmin')    
df[df.duplicated(subset=['col1','col2'], keep='first')]

   col1  col2  index_original
2     1     2               0
4     1     2               0

详情

groupby前两列,然后调用transform+idxmin获取每个组的第一个索引。

df.groupby(['col1', 'col2']).col1.transform('idxmin') 

0    0
1    1
2    0
3    3
4    0
Name: col1, dtype: int64

duplicated 给了我一个我想要保留的值的布尔掩码:

df.duplicated(subset=['col1','col2'], keep='first')

0    False
1    False
2     True
3    False
4     True
dtype: bool

剩下的只是布尔索引

【讨论】:

@cᴏʟᴅsᴘᴇᴇᴅ 您好,该解决方案对于该示例非常有效,但是当我尝试将其应用于我的真实案例时,它需要永远......大小为 (11861200,2) @gabboshow 1100 万行?太可怕了……您应该尝试使用dask 并行化您的 groupby 操作,您可以通过这种方式处理巨大的数据帧。 我仍然认为它会很慢......有没有办法不使用 groupby 或者这是最快的解决方案? @gabboshow 如果您使用的是 pandas.... 没有比使用 groupby 更好的方法了...您可以尝试在 numpy 标签中提出类似的问题,看看 divakar 是否有为您提供 numpy 解决方案...(他可能)。 @cs95 如果我有 90 列怎么办?【参考方案2】:

也许您不再需要这个答案,但还有另一种方法可以找到重复的行:

df=pd.DataFrame(data=[[1,2],[3,4],[1,2],[1,4],[1,2]],columns=['col1','col2'])

鉴于上面的 DataFrame,您可以使用 groupby 没有戏剧性,但使用较大的 DataFrame,它会有点慢,而不是您可以使用

DataFrame.duplicated(subset=None, keep='first') 返回表示重复行的布尔系列。

正如documenation 所说,它返回一个布尔系列,换句话说,一个布尔掩码,因此您可以使用该掩码操作 DataFrame,或者只是可视化重复的行:

>>> df[df.duplicated()]
   col1  col2
2     1     2
4     1     2

如果您有一个包含更多列的 DataFrame,并且您想按特定列查找重复的行,您可以为函数提供要查找的列列表,例如以下 DataFrame:

# List of Tuples
students = [('jack', 34, 'Sydeny'),
            ('Riti', 30, 'Delhi'),
            ('Aadi', 16, 'New York'),
            ('Riti', 30, 'Delhi'),
            ('Riti', 30, 'Delhi'),
            ('Riti', 30, 'Mumbai'),
            ('Aadi', 40, 'London'),
            ('Sachin', 30, 'Delhi')
            ]
# Create a DataFrame object
df = pd.DataFrame(students, columns=['Name', 'Age', 'City'])

如果您想按所有列查找重复的行并将其可视化,只需执行以下操作:

>>> df[df.duplicated()]
   Name  Age   City
3  Riti   30  Delhi
4  Riti   30  Delhi

但如果您只想查找重复的行并仅考虑两列,例如“姓名”和“年龄”,只需执行以下操作:

>>> df[df.duplicated(['Name', 'Age'])]
   Name  Age    City
3  Riti   30   Delhi
4  Riti   30   Delhi
5  Riti   30  Mumbai

或者只有一列,例如“名称”:

>>> df[df.duplicated(['Name'])]
   Name  Age    City
3  Riti   30   Delhi
4  Riti   30   Delhi
5  Riti   30  Mumbai
6  Aadi   40  London

上面的例子只是返回了重复的行,而不是“原始的”,所以如果你看这些例子,如果按照给定的条件有三个重复的行,那么只会返回两个。

【讨论】:

辛苦了!并且对于更大的数据帧肯定更快。 +10 :)【参考方案3】:
len(df[df.duplicated()])

通过这种方法,您可以统计数据集中重复的数量。

【讨论】:

以上是关于在熊猫数据框中查找重复行的主要内容,如果未能解决你的问题,请参考以下文章

将列值分配给熊猫数据框中的唯一行[重复]

从熊猫数据框中删除重复行:不区分大小写的比较

如何根据条件表达式从熊猫数据框中删除行[重复]

如何根据条件表达式从熊猫数据框中删除行[重复]

在拆分为多个文件的大型数据框中查找重复行和包含重复行的文件

根据索引在熊猫数据框中查找特定列的值[重复]