Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

จะค้นหาและกรองแถวที่ซ้ำกันใน Pandas ได้อย่างไร


บางครั้งระหว่างการวิเคราะห์ข้อมูล เราต้องดูที่แถวที่ซ้ำกันเพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับข้อมูลของเราแทนที่จะทิ้งทันที

โชคดีที่ในแพนด้า เรามีวิธีการสองสามวิธีในการเล่นกับตัวที่ซ้ำกัน

.duplciated()

วิธีนี้ช่วยให้เราสามารถแยกแถวที่ซ้ำกันใน DataFrame เราจะใช้ชุดข้อมูลใหม่ที่ซ้ำกัน ฉันดาวน์โหลดชุดข้อมูล 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)



Employee_Name
ตำแหน่ง
CitizenDesc
คะแนนผลงาน
0
อะดินอลฟี่
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
เกิน
1
อะดินอลฟี่
ซีเนียร์ DBA
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
2
อะดินอลฟี่
ช่างเทคนิคการผลิต II
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่


วิธีการทำงานของสำเนา () โดยค่าเริ่มต้นคือโดยให้พารามิเตอร์ พารามิเตอร์นี้จะทำเครื่องหมายการเกิดขึ้นครั้งแรกของแต่ละค่าว่าไม่ซ้ำกัน

เมธอดนี้จะไม่ทำเครื่องหมายแถวว่าซ้ำกันหากมีอยู่มากกว่าหนึ่งครั้ง แต่จะทำเครื่องหมายแถวที่ตามมาแต่ละแถวหลังแถวแรกว่าซ้ำกัน สับสน? ให้ฉันลองอธิบายอีกครั้งด้วยตัวอย่าง สมมติว่ามีแอปเปิ้ล 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()]



Employee_Name
ตำแหน่ง
CitizenDesc
คะแนนผลงาน
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")]



Employee_Name
ตำแหน่ง
CitizenDesc
คะแนนผลงาน
0
อะดินอลฟี่
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
เกิน
1
อะดินอลฟี่
ซีเนียร์ DBA
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
2
อะดินอลฟี่
ช่างเทคนิคการผลิต II
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
3
อะดินอลฟี่
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
5
แอนเดอร์สัน
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
...
...
...
...
...
302
วัง
ช่างเทคนิคการผลิต II
พลเมืองสหรัฐฯ
เกิน
303
วัง
ช่างเทคนิคการผลิต II
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
304
วัง
ช่างเทคนิคการผลิต II
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
305
วัง
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
PIP
306
วัง
ซีไอโอ
พลเมืองสหรัฐฯ
เกิน

อาร์กิวเมนต์ - เท็จ

พารามิเตอร์ Keep จะยอมรับอาร์กิวเมนต์เพิ่มเติม "เท็จ" ซึ่งจะทำเครื่องหมายค่าทั้งหมดที่เกิดขึ้นมากกว่าหนึ่งครั้งว่าซ้ำกัน ในกรณีของเรา แอปเปิลทั้งหมด 3 ผลจะถูกทำเครื่องหมายว่าซ้ำกัน แทนที่จะเป็นค่าแรกหรือค่าสุดท้ายดังที่แสดงในตัวอย่างข้างต้น

หมายเหตุ – เมื่อระบุพารามิเตอร์เท็จอย่าใช้เครื่องหมายคำพูด

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



Employee_Name
ตำแหน่ง
CitizenDesc
คะแนนผลงาน
0
อะดินอลฟี่
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
เกิน
1
อะดินอลฟี่
ซีเนียร์ DBA
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
2
อะดินอลฟี่
ช่างเทคนิคการผลิต II
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
3
อะดินอลฟี่
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
4
อะดินอลฟี่
ผู้จัดการฝ่ายผลิต
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
...
...
...
...
...
303
วัง
ช่างเทคนิคการผลิต II
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
304
วัง
ช่างเทคนิคการผลิต II
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
305
วัง
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
PIP
306
วัง
ซีไอโอ
พลเมืองสหรัฐฯ
เกิน
307
วัง
นักวิเคราะห์ข้อมูล
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่

สุดท้ายนี้ ในการดึงค่าที่ไม่ซ้ำกันออกจากชุดข้อมูล เราสามารถใช้สัญลักษณ์ “~” (tilda) เพื่อลบล้างค่า

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



Employee_Name
ตำแหน่ง
CitizenDesc
คะแนนผลงาน
7
อันเดรโอลา
วิศวกรซอฟต์แวร์
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
25
บอซซี่
ผู้จัดการฝ่ายผลิต
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
26
บรามันเต้
ผู้อำนวยการฝ่ายปฏิบัติการ
พลเมืองสหรัฐฯ
เกิน
27
Brill
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
34
Burkett
ช่างเทคนิคการผลิต II
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
...
...
...
...
...
276
น้ำหวาน
วิศวกรซอฟต์แวร์
พลเมืองสหรัฐฯ
เกิน
277
ซาโบ
ช่างเทคนิคการผลิต I
ไม่ใช่พลเมือง
ตอบสนองอย่างเต็มที่
278
ทาวาเรส
ช่างเทคนิคการผลิต II
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
308
โจว
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
309
ซีม่า
น่าน
น่าน
น่าน

drop_duplicates()

วิธีนี้ค่อนข้างคล้ายกับวิธีก่อนหน้านี้ อย่างไรก็ตาม วิธีนี้สามารถอยู่ใน DataFrame แทนที่จะเป็นชุดเดียว

หมายเหตุ:- วิธีนี้จะค้นหาแถวที่ซ้ำกันในคอลัมน์ทั้งหมดของ DataFrame แล้ววางลง

len(df)

ผลลัพธ์

310


len(df.drop_duplicates())

ผลลัพธ์

290

พารามิเตอร์ย่อย

พารามิเตอร์เซตย่อยยอมรับรายชื่อคอลัมน์เป็นค่าสตริง ซึ่งเราสามารถตรวจหารายการซ้ำได้

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

Employee_Name
ตำแหน่ง
CitizenDesc
คะแนนผลงาน
0
อะดินอลฟี่
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
เกิน
5
แอนเดอร์สัน
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
7
อันเดรโอลา
วิศวกรซอฟต์แวร์
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
14
อัธวัล
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
20
จงอยปาก
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
...
...
...
...
...
293
วอน มัสเซนบัค
ช่างเทคนิคการผลิต II
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
295
วอลเลซ
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
ต้องปรับปรุง
300
วัง
ช่างเทคนิคการผลิต I
ไม่ใช่พลเมืองที่มีสิทธิ์
ตอบสนองอย่างเต็มที่
308
โจว
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
309
ซีม่า
น่าน
น่าน
น่าน

เราสามารถระบุหลายคอลัมน์และใช้พารามิเตอร์เก็บทั้งหมดที่กล่าวถึงในส่วนก่อนหน้าได้

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



Employee_Name
ตำแหน่ง
CitizenDesc
คะแนนผลงาน
7
อันเดรโอลา
วิศวกรซอฟต์แวร์
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
16
จงอยปาก
ช่างเทคนิคการผลิต I
ผู้ที่ไม่ใช่พลเมืองที่มีสิทธิ์
ตอบสนองอย่างเต็มที่
25
บอซซี่
ผู้จัดการฝ่ายผลิต
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
26
บรามันเต้
ผู้อำนวยการฝ่ายปฏิบัติการ
พลเมืองสหรัฐฯ
เกิน
27
Brill
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
...
...
...
...
...
287
เทเจดา
วิศวกรเครือข่าย
ผู้ที่ไม่ใช่พลเมืองที่มีสิทธิ์
ตอบสนองอย่างเต็มที่
286
เทเจดา
วิศวกรซอฟต์แวร์
ไม่ใช่พลเมือง
ตอบสนองอย่างเต็มที่
300
วัง
ช่างเทคนิคการผลิต I
ผู้ที่ไม่ใช่พลเมืองที่มีสิทธิ์
ตอบสนองอย่างเต็มที่
308
โจว
ช่างเทคนิคการผลิต I
พลเมืองสหรัฐฯ
ตอบสนองอย่างเต็มที่
309
ซีม่า
น่าน
น่าน
น่าน

วิธีเฉพาะ ()

เมธอดเฉพาะจะค้นหาค่าที่ไม่ซ้ำในชุดข้อมูลและส่งคืนค่าที่ไม่ซ้ำเป็นอาร์เรย์ เมธอดนี้ไม่รวมค่าที่หายไป

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

.nuique() วิธีการ

วิธีนี้จะคืนค่าจำนวนค่าที่ไม่ซ้ำในชุดข้อมูล โดยค่าเริ่มต้น วิธีการนี้จะไม่รวมค่าที่หายไปโดยใช้พารามิเตอร์ dropna =True

คุณสามารถส่งอาร์กิวเมนต์ False ไปยังพารามิเตอร์ dropna เพื่อไม่ปล่อยค่าที่หายไปได้

df["Employee_Name"].nunique()

ผลลัพธ์

231


df["Employee_Name"].nunique(dropna=False)

ผลลัพธ์

231