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

新手上路,请多包涵

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

 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 可能非常大….

原文由 gabboshow 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 350
2 个回答

使用 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

剩下的只是 _布尔索引_。

原文由 cs95 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

 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’)

返回表示重复行的布尔系列。

正如 文档 所说,它返回一个布尔系列,换句话说,一个布尔掩码,因此您可以使用该掩码操作 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

上面的示例只返回重复的行,而不是“原始行”,所以如果您查看示例,如果给定条件有三个重复行,则只会返回两个。

原文由 Merrydjff 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题