ในการวิเคราะห์ข้อมูล บางครั้งเราต้องการตรวจสอบแถวซ้ำเพื่อทำความเข้าใจข้อมูลมากขึ้น แทนที่จะลบทิ้งทันที โชคดีที่ Pandas มีเมธอดหลายตัวสำหรับจัดการกับข้อมูลซ้ำ
เมธอด .duplicated()
เมธอดนี้ช่วยให้เราสามารถดึงแถวซ้ำออกมาจาก DataFrame ได้ เราจะใช้ชุดข้อมูล HR ที่มีข้อมูลซ้ำ ซึ่งดาวน์โหลดมาจากลิงก์นี้
import pandas as pd
import numpy as np
# นำเข้า HR Dataset พร้อมคอลัมน์ที่กำหนด
df = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/HRDataset.csv",
usecols=["Employee_Name", "PerformanceScore", "Position", "CitizenDesc"])
# เรียงลำดับตามชื่อพนักงานและทำให้เป็นถาวร
df.sort_values("Employee_Name", inplace=True)
df.head(3)
ผลลัพธ์ตัวอย่าง:
| Employee_Name | Position | CitizenDesc | PerformanceScore | |
|---|---|---|---|---|
| 0 | Adinolfi | Production Technician I | US Citizen | Exceeds |
| 1 | Adinolfi | Sr. DBA | US Citizen | Fully Meets |
| 2 | Adinolfi | Production Technician II | US Citizen | Fully Meets |
โดยค่าเริ่มต้น .duplicated() ทำงานโดยใช้พารามิเตอร์ keep ซึ่งจะทำเครื่องหมายการเกิดครั้งแรกของแต่ละค่าเป็น ไม่ซ้ำ และการเกิดต่อเนื่องจะถูกทำเครื่องหมายว่าเป็นแถวซ้ำ
ตัวอย่างเช่น หากมีแอปเปิ้ล 3 ลูกในตะกร้า เมธอดนี้จะทำเครื่องหมายลูกแรกว่าไม่ซ้ำ และอีก 2 ลูกว่าซ้ำ
ตัวอย่างการใช้งาน
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
เพื่อดึงแถวซ้ำออกมา (จำไว้ว่า การเกิดครั้งแรกไม่ใช่ซ้ำ แต่การเกิดต่อเนื่องคือซ้ำ) เราต้องส่งเมธอดนี้เข้า DataFrame
df.shape
(310, 4)
df[df["Employee_Name"].duplicated()]
ผลลัพธ์: 79 แถว × 4 คอลัมน์ (จากทั้งหมด 310 แถว)
อาร์กิวเมนต์ "last"
เราสามารถเปลี่ยนพฤติกรรมได้โดยส่ง keep="last" ซึ่งจะทำเครื่องหมายการเกิดสองครั้งแรกว่าเป็นซ้ำ และครั้งสุดท้ายว่าไม่ซ้ำ
df[df["Employee_Name"].duplicated(keep="last")]
อาร์กิวเมนต์ False
พารามิเตอร์ keep ยังรับค่า False ได้ ซึ่งจะทำเครื่องหมาย ทุกค่า ที่เกิดมากกว่า 1 ครั้งว่าเป็นซ้ำ (ทั้ง 3 ลูกแอปเปิ้ลจะเป็นซ้ำทั้งหมด)
False อย่าใช้เครื่องหมายคำพูดdf[df["Employee_Name"].duplicated(keep=False)]
การดึงค่าที่ไม่ซ้ำ (Unique Values)
ใช้สัญลักษณ์ ~ (ทิลดา) เพื่อทำการ negative selection
df_unique = ~df["Employee_Name"].duplicated(keep=False) df[df_unique]
เมธอด .drop_duplicates()
เมธอดนี้คล้ายกับ .duplicated() แต่ใช้ได้กับ DataFrame ทั้งหมด โดยค้นหาแถวซ้ำจาก ทุกคอลัมน์ และลบทิ้ง
len(df)
310
len(df.drop_duplicates())
290
พารามิเตอร์ subset
พารามิเตอร์ subset รับรายการชื่อคอลัมน์เพื่อตรวจสอบความซ้ำเฉพาะคอลัมน์ที่กำหนด
df1 = df.drop_duplicates(subset=["Employee_Name"], keep="first") df1
เราสามารถระบุหลายคอลัมน์และใช้ค่า keep ทั้งหมดที่อธิบายไปแล้ว
df1 = df.drop_duplicates(subset=["Employee_Name", "CitizenDesc"], keep=False) df1
เมธอด .unique()
หาค่าที่ไม่ซ้ำใน Series และคืนค่าเป็น Array ไม่ตัดค่า missing values ออก
len(df["Employee_Name"])
310
df["Employee_Name"].unique()
len(df["Employee_Name"].unique())
231
เมธอด .nunique()
คืนจำนวนค่าที่ไม่ซ้ำใน Series โดยค่าเริ่มต้นตัด missing values ออก (dropna=True)
df["Employee_Name"].nunique()
231
df["Employee_Name"].nunique(dropna=False)
231