有时,在进行数据分析时,我们需要查看重复的行以更多地了解我们的数据,而不是立即删除它们。
这个方法让我们可以提取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()方法提取的。
默认情况下,此方法会将值的第一次出现标记为非重复,我们可以通过传递参数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 | 王 | 首席信息官 | 美国公民 | 超过 |
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 |
此方法与先前的方法非常相似,但是此方法可以在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 |
唯一方法在一系列中查找唯一值,并将唯一值作为数组返回。此方法不排除缺少的值。
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
此方法返回序列中唯一值的数量。默认情况下,此方法使用参数dropna = True排除缺失值。
您可以将False参数传递给dropna参数,以不删除丢失的值。
df["Employee_Name"].nunique()
输出结果
231
df["Employee_Name"].nunique(dropna=False)
输出结果
231