如何在 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)
輸出
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