如何在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)
默认情况下,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()]
79行×4列
从上面的输出中,有310行具有79个重复项,这些行是使用.duplicated()方法提取的。
参数-“last”
默认情况下,此方法会将值的第一次出现标记为非重复,我们可以通过传递参数keep=last来更改此行为。
该参数将要执行的操作是将前两个苹果标记为重复,最后一个苹果标记为非重复。
df[df["Employee_Name"].duplicated(keep="last")]
参数-false
keep参数还将接受一个额外的参数“false”,该参数会将所有出现多次的值标记为重复项,在我们的示例中,所有3个苹果将被标记为重复项,而不是上面示例中所示的第一个或最后一个。
注–指定false参数时,请勿使用引号。
df[df"Employee_Name"].duplicated(keep=False)]
现在最后,要从数据集中提取唯一值,我们可以使用“〜”(tilda)符号取反值
df_unique~df["Employee_Name"].duplicated(keep=False)df[df_unique]
drop_duplicates()
此方法与先前的方法非常相似,但是此方法可以在DataFrame上而不是在单个序列上。
注意:-此方法在DataFrame的所有列上查找重复的行并将其删除。
len(df)
输出结果
310
len(df.drop_duplicates())
输出结果
290
子参数
参数subset接受列名列表作为字符串值,我们可以在其中检查重复项。
df1=df.drop_duplicates(subset=["Employee_Name"],keep="first")df1
我们可以指定多个列,并使用上一节中讨论的所有keep参数。
df1=df.drop_duplicates(subset="Employee_Name""CitizenDesc"],keep=False)df1
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