如何在 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