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

有时,在进行数据分析时,我们需要查看重复的行以更多地了解我们的数据,而不是立即删除它们。

.duplciated()

这个方法让我们可以提取DataFrame中的重复行。我们将使用具有重复项的新数据集。我已经从link下载了Hr数据集。

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)

员工姓名
位置
公民描述
PerformanceScore
0
阿迪诺尔菲
生产技术员I
美国公民
超过
1
阿迪诺尔菲
高级DBA
美国公民
符合
2
阿迪诺尔菲
生产技术员II
美国公民
符合

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

如果该行存在多次,则该方法不会将其标记为重复,而是将第一行之后的每个后续行标记为重复。困惑?让我尝试用一个例子再解释一次,假设篮子中有3个苹果,此方法的作用是将第一个苹果标记为非重复,并将其余两个苹果标记为重复。

示例

df["Employee_Name"].head(3)

输出结果

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()]

员工姓名
位置
公民描述
PerformanceScore
1
阿迪诺尔菲
高级DBA
美国公民
符合
2
阿迪诺尔菲
生产技术员II
美国公民
符合
3
阿迪诺尔菲
生产技术员I
美国公民
符合
4
阿迪诺尔菲
产品经理
美国公民
符合
6
安德森
生产技术员I
美国公民
超过
...
...
...
...
...
303

生产技术员II
美国公民
符合
304

生产技术员II
美国公民
符合
305

生产技术员I
美国公民
PIP
306

首席信息官
美国公民
超过
307

数据分析师
美国公民
符合

79行×4列

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

参数-“last”

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

该参数将要执行的操作是将前两个苹果标记为重复,最后一个苹果标记为非重复。

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

员工姓名
位置
公民描述
PerformanceScore
0
阿迪诺尔菲
生产技术员I
美国公民
超过
1
阿迪诺尔菲
高级DBA
美国公民
符合
2
阿迪诺尔菲
生产技术员II
美国公民
符合
3
阿迪诺尔菲
生产技术员I
美国公民
符合
5
安德森
生产技术员I
美国公民
符合
...
...
...
...
...
302

生产技术员II
美国公民
超过
303

生产技术员II
美国公民
符合
304

生产技术员II
美国公民
符合
305

生产技术员I
美国公民
PIP
306

首席信息官
美国公民
超过

参数-false

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

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

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

员工姓名
位置
公民描述
PerformanceScore
0
阿迪诺尔菲
生产技术员I
美国公民
超过
1
阿迪诺尔菲
高级DBA
美国公民
符合
2
阿迪诺尔菲
生产技术员II
美国公民
符合
3
阿迪诺尔菲
生产技术员I
美国公民
符合
4
阿迪诺尔菲
产品经理
美国公民
符合
...
...
...
...
...
303

生产技术员II
美国公民
符合
304

生产技术员II
美国公民
符合
305

生产技术员I
美国公民
画中画
306

首席信息官
美国公民
超过
307

数据分析师
美国公民
符合

现在最后,要从数据集中提取唯一值,我们可以使用“〜”(tilda)符号取反值

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

员工姓名
位置
公民描述
PerformanceScore
7
安德烈奥拉
软件工程师
美国公民
符合
25
博齐
产品经理
美国公民
符合
26
布拉曼特
运营总监
美国公民
超过
27
布里尔
生产技术员I
美国公民
符合
34
伯凯特
生产技术员II
美国公民
符合
...
...
...
...
...
276
甜水
软件工程师
美国公民
超过
277
萨博
生产技术员I
非公民
符合
278
塔瓦雷斯
生产技术员II
美国公民
符合
308

生产技术员I
美国公民
符合
309
泽玛
N
N
N

drop_duplicates()

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

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

len(df)

输出结果

310
len(df.drop_duplicates())

输出结果

290

子参数

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

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

员工姓名
位置
公民描述
PerformanceScore
0
阿迪诺尔菲
生产技术员I
美国公民
超过
5
安德森
生产技术员I
美国公民
符合
7
安德烈奥拉
软件工程师
美国公民
符合
14
阿斯瓦尔
生产技术员I
美国公民
符合
20

生产技术员I
美国公民
符合
...
...
...
...
...
293
冯·马森巴赫
生产技术员II
美国公民
符合
295
华莱士
生产技术员I
美国公民
需要改进
300

生产技术员I
符合条件的非公民
符合
308

生产技术员I
美国公民
符合
309
泽玛
N
N
N

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

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

员工姓名
位置
公民描述
PerformanceScore
7
安德烈奥拉
软件工程师
美国公民
符合
16

生产技术员I
符合条件的非公民
符合
25
博齐
产品经理
美国公民
符合
26
布拉曼特
运营总监
美国公民
超过
27
布里尔
生产技术员I
美国公民
符合
...
...
...
...
...
287
特耶达
网络工程师
符合条件的非公民
符合
286
特耶达
软件工程师
非公民
符合
300

生产技术员I
符合条件的非公民
符合
308

生产技术员I
美国公民
符合
309
泽玛
N
N
N

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
猜你喜欢