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

更新於: 2020年11月10日

6K+ 次檢視

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告