如何在 Pandas 中查找和过滤重复行?


有时在数据分析过程中,我们需要查看重复的行以更多地了解我们的数据,而不是直接将其删除。

幸运的是,在 pandas 中,我们有一些方法可以处理重复项。

.duplicated()

此方法允许我们在 DataFrame 中提取重复行。我们将使用一个包含重复项的新数据集。我已从链接下载了人力资源数据集。

import pandas as pd
import numpy as np

# Import HR Dataset with certain columns
df = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/HRDataset.csv",
usecols = ("Employee_Name""PerformanceScore","Position","CitizenDesc"))

#Sort the values on employee name and make it permanent
df.sort_values("Employee_Name"inplace = True)
df.head(3)



员工姓名
职位
公民描述
绩效评分
0
Adinolfi
生产技术员 I
美国公民
超出预期
1
Adinolfi
高级 DBA
美国公民
完全满足
2
Adinolfi
生产技术员 II
美国公民
完全满足


duplicated() 方法默认的工作方式是通过 keep 参数,此参数将标记每个值的第一次出现为非重复项。

此方法不会将一行标记为重复项(如果它存在多次),而是将第一行之后的每一行标记为重复项。困惑?让我再用一个例子解释一下,假设一个篮子里有 3 个苹果,此方法的作用是将第一个苹果标记为非重复项,其余两个苹果标记为重复项。

示例

df["Employee_Name"].head(3)

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

输出

0 Adinolfi
1 Adinolfi
2 Adinolfi
Name: Employee_Name, dtype: object

示例

df["Employee_Name"].duplicated().head(3)

输出

0 False
1 True
2 True
Name: Employee_Name, dtype: bool

现在要提取重复项(记住第一次出现不是重复项,而是后续出现是重复项,并且将由此方法输出),我们需要将此方法传递给数据帧。

df.shape


(310, 4)


df[df["Employee_Name"].duplicated()]



员工姓名
职位
公民描述
绩效评分
1
Adinolfi
高级 DBA
美国公民
完全满足
2
Adinolfi
生产技术员 II
美国公民
完全满足
3
Adinolfi
生产技术员 I
美国公民
完全满足
4
Adinolfi
生产经理
美国公民
完全满足
6
Anderson
生产技术员 I
美国公民
超出预期
...
...
...
...
...
303
Wang
生产技术员 II
美国公民
完全满足
304
Wang
生产技术员 II
美国公民
完全满足
305
Wang
生产技术员 I
美国公民
改进计划
306
Wang
首席信息官
美国公民
超出预期
307
Wang
数据分析师
美国公民
完全满足

79 列 × 4 行

从上面的输出中,有 310 行,其中 79 个重复项是使用 .duplicated() 方法提取的。

参数 -“LAST”

默认情况下,此方法将标记值的第一次出现为非重复项,我们可以通过传递参数 keep = last 来更改此行为。

此参数的作用是将前两个苹果标记为重复项,最后一个标记为非重复项。

df[df["Employee_Name"].duplicated(keep="last")]



员工姓名
职位
公民描述
绩效评分
0
Adinolfi
生产技术员 I
美国公民
超出预期
1
Adinolfi
高级 DBA
美国公民
完全满足
2
Adinolfi
生产技术员 II
美国公民
完全满足
3
Adinolfi
生产技术员 I
美国公民
完全满足
5
Anderson
生产技术员 I
美国公民
完全满足
...
...
...
...
...
302
Wang
生产技术员 II
美国公民
超出预期
303
Wang
生产技术员 II
美国公民
完全满足
304
Wang
生产技术员 II
美国公民
完全满足
305
Wang
生产技术员 I
美国公民
改进计划
306
Wang
首席信息官
美国公民
超出预期

参数 - FALSE

keep 参数还将接受一个额外的参数“false”,它将标记所有出现多次的值为重复项,在我们的例子中,所有 3 个苹果都将被标记为重复项,而不是像上面示例中显示的那样标记第一个或最后一个。

注意 – 指定 false 参数时,请勿使用引号。

df[df"Employee_Name"].duplicated(keep=False)]



员工姓名
职位
公民描述
绩效评分
0
Adinolfi
生产技术员 I
美国公民
超出预期
1
Adinolfi
高级 DBA
美国公民
完全满足
2
Adinolfi
生产技术员 II
美国公民
完全满足
3
Adinolfi
生产技术员 I
美国公民
完全满足
4
Adinolfi
生产经理
美国公民
完全满足
...
...
...
...
...
303
Wang
生产技术员 II
美国公民
完全满足
304
Wang
生产技术员 II
美国公民
完全满足
305
Wang
生产技术员 I
美国公民
改进计划
306
Wang
首席信息官
美国公民
超出预期
307
Wang
数据分析师
美国公民
完全满足

现在,最后,要从数据集中提取唯一值,我们可以使用“~”(波浪号)符号来否定这些值

df_unique~df["Employee_Name"].duplicated(keep=False)df[df_unique]



员工姓名
职位
公民描述
绩效评分
7
Andreola
软件工程师
美国公民
完全满足
25
Bozzi
生产经理
美国公民
完全满足
26
Bramante
运营总监
美国公民
超出预期
27
Brill
生产技术员 I
美国公民
完全满足
34
Burkett
生产技术员 II
美国公民
完全满足
...
...
...
...
...
276
Sweetwater
软件工程师
美国公民
超出预期
277
Szabo
生产技术员 I
非公民
完全满足
278
Tavares
生产技术员 II
美国公民
完全满足
308
Zhou
生产技术员 I
美国公民
完全满足
309
Zima
NaN
NaN
NaN

drop_duplicates()

此方法与之前的方法非常相似,但是此方法可以在 DataFrame 上而不是在单个序列上使用。

注意:- 此方法查找 DataFrame 所有列上的重复行并将其删除。

len(df)

输出

310


len(df.drop_duplicates())

输出

290

子集参数

subset 参数接受一个列名列表作为字符串值,我们可以在其中检查重复项。

df1=df.drop_duplicates(subset=["Employee_Name"],keep="first")df1

员工姓名
职位
公民描述
绩效评分
0
Adinolfi
生产技术员 I
美国公民
超出预期
5
Anderson
生产技术员 I
美国公民
完全满足
7
Andreola
软件工程师
美国公民
完全满足
14
Athwal
生产技术员 I
美国公民
完全满足
20
Beak
生产技术员 I
美国公民
完全满足
...
...
...
...
...
293
Von Massenbach
生产技术员 II
美国公民
完全满足
295
Wallace
生产技术员 I
美国公民
需要改进
300
Wang
生产技术员 I
合格非公民
完全满足
308
Zhou
生产技术员 I
美国公民
完全满足
309
Zima
NaN
NaN
NaN

我们可以指定多个列并使用上一节中讨论的所有 keep 参数。

df1=df.drop_duplicates(subset="Employee_Name""CitizenDesc"],keep=False)df1



员工姓名
职位
公民描述
绩效评分
7
Andreola
软件工程师
美国公民
完全满足
16
Beak
生产技术员 I
合格非公民
完全满足
25
Bozzi
生产经理
美国公民
完全满足
26
Bramante
运营总监
美国公民
超出预期
27
Brill
生产技术员 I
美国公民
完全满足
...
...
...
...
...
287
Tejeda
网络工程师
合格非公民
完全满足
286
Tejeda
软件工程师
非公民
完全满足
300
Wang
生产技术员 I
合格非公民
完全满足
308
Zhou
生产技术员 I
美国公民
完全满足
309
Zima
NaN
NaN
NaN

unique() 方法

unique 方法查找序列中的唯一值并将唯一值作为数组返回。此方法不排除缺失值。

len(df["Employee_Name"])

输出

310


df["Employee_Name"].unique()


array(['Adinolfi', 'Anderson', 'Andreola', 'Athwal', 'Beak', 'Bondwell',
'Bozzi', 'Bramante', 'Brill', 'Brown', 'Burkett', 'Butler',
'Carabbio', 'Carey', 'Carr', 'Carter', 'Chace', 'Champaigne',
'Chan', 'Chang', 'Chivukula', 'Cierpiszewski', 'Cisco', 'Clayton',
'Cloninger', 'Close', 'Clukey', 'Cockel', 'Cole', 'Cornett',
'Costa', 'Crimmings', 'Daneault', 'Daniele', 'Darson', 'Davis',
'DeGweck', 'Del Bosque', 'Demita', 'Desimone', 'DiNocco',
'Dickinson', 'Dietrich', 'Digitale', 'Dobrin', 'Dolan', 'Dougall',
'Dunn', 'Eaton', 'Employee_Name', 'Engdahl', 'England', 'Erilus',
'Estremera', 'Evensen', 'Exantus', 'Faller', 'Fancett', 'Favis',
'Ferguson', 'Fernandes', 'Ferreira', 'Fidelia', 'Fitzpatrick',
'Foreman', 'Foss', 'Foster-Baker', 'Fraval', 'Friedman', 'Galia',
'Garcia', 'Garneau', 'Gaul', 'Gentry', 'Gerke', 'Gill', 'Gonzales',
'Gonzalez', 'Good', 'Handschiegl', 'Hankard', 'Harrison',
'Heitzman', 'Horton', 'Houlihan', 'Howard', 'Hubert', 'Hunts',
'Hutter', 'Huynh', 'Immediato', 'Ivey', 'Jackson', 'Jacobi',
'Jeannite', 'Jeremy Prater', 'Jhaveri', 'Johnson', 'Johnston',
'Jung', 'Kampew', 'Keatts', 'Khemmich', 'King', 'Kinsella',
'Kirill', 'Knapp', 'Kretschmer', 'LaRotonda', 'Lajiri', 'Langford',
'Langton', 'Latif', 'Le', 'LeBel', 'LeBlanc', 'Leach', 'Leruth',
'Liebig', 'Linares', 'Linden', 'Lindsay', 'Lundy', 'Lunquist',
'Lydon', 'Lynch', 'MacLennan', 'Mahoney', 'Manchester', 'Mancuso',
'Mangal', 'Martin', 'Martins', 'Maurice', 'McCarthy', 'McKinzie',
'Mckenna', 'Meads', 'Medeiros', 'Merlos', 'Miller', 'Monkfish',
'Monroe', 'Monterro', 'Moran', 'Morway', 'Motlagh', 'Moumanil',
'Mullaney', 'Murray', 'Navathe', 'Ndzi', 'Newman', 'Ngodup',
'Nguyen', 'Nowlan', 'O'hare', 'Oliver', 'Onque', 'Osturnka',
'Owad', 'Ozark', 'Panjwani', 'Patronick', 'Pearson', 'Pelech',
'Pelletier', 'Perry', 'Peters', 'Peterson', 'Petingill',
'Petrowsky', 'Pham', 'Pitt', 'Potts', 'Power', 'Punjabhi',
'Purinton', 'Quinn', 'Rachael', 'Rarrick', 'Rhoads', 'Riordan',
'Rivera', 'Roberson', 'Robertson', 'Robinson', 'Roby', 'Roehrich',
'Rogers', 'Roper', 'Rose', 'Rossetti', 'Roup', 'Ruiz', 'Saada',
'Saar-Beckles', 'Sadki', 'Sahoo', 'Salter', 'Sander', 'Semizoglou',
'Sewkumar', 'Shepard', 'Shields', 'Simard', 'Singh', 'Sloan',
'Smith', 'Soto', 'South', 'Sparks', 'Spirea', 'Squatrito',
'Stanford', 'Stanley', 'Steans', 'Stoica', 'Strong', 'Sullivan',
'Sutwell', 'Sweetwater', 'Szabo', 'Tavares', 'Tejeda', 'Veera',
'Von Massenbach', 'Wallace', 'Wang', 'Zhou', 'Zima'], dtype=object)


len(df["Employee_Name"].unique())

输出

231

.nunique() 方法

此方法返回序列中唯一值的个数。此方法默认情况下使用参数 dropna = True 排除缺失值。

您可以将 False 参数传递给 dropna 参数以不删除缺失值。

df["Employee_Name"].nunique()

输出

231


df["Employee_Name"].nunique(dropna=False)

输出

231

更新于: 2020年11月10日

6K+ 次查看

开启你的职业生涯

通过完成课程获得认证

开始学习
广告