บางครั้งระหว่างการวิเคราะห์ข้อมูล เราต้องดูที่แถวที่ซ้ำกันเพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับข้อมูลของเราแทนที่จะทิ้งทันที
โชคดีที่ในแพนด้า เรามีวิธีการสองสามวิธีในการเล่นกับตัวที่ซ้ำกัน
.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