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

วิธีค้นหาและกรองแถวซ้ำใน Pandas

ในการวิเคราะห์ข้อมูล บางครั้งเราต้องการตรวจสอบแถวซ้ำเพื่อทำความเข้าใจข้อมูลมากขึ้น แทนที่จะลบทิ้งทันที โชคดีที่ 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_NamePositionCitizenDescPerformanceScore
0AdinolfiProduction Technician IUS CitizenExceeds
1AdinolfiSr. DBAUS CitizenFully Meets
2AdinolfiProduction Technician IIUS CitizenFully 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