Trong quá trình phân tích dữ liệu, đôi khi chúng ta cần xem xét các hàng trùng lặp để hiểu rõ hơn về dữ liệu thay vì xóa chúng ngay lập tức. May mắn thay, pandas cung cấp một vài phương pháp để làm việc với các bản sao.
Phương thức .duplicated()
Phương thức này cho phép trích xuất các hàng trùng lặp trong DataFrame. Chúng ta sẽ sử dụng một bộ dữ liệu mới chứa các bản sao. Tôi đã tải bộ dữ liệu HR từ liên kết sau.
import pandas as pd
import numpy as np
# Nhập bộ dữ liệu HR với các cột cụ thể
df = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/HRDataset.csv",
usecols=["Employee_Name", "PerformanceScore", "Position", "CitizenDesc"])
# Sắp xếp theo tên nhân viên và làm cho thay đổi này vĩnh viễn
df.sort_values("Employee_Name", inplace=True)
df.head(3)
Kết quả hiển thị 3 hàng đầu tiên:
| 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 |
Cách thức hoạt động mặc định của duplicated() dựa trên tham số keep. Tham số này sẽ đánh dấu lần xuất hiện đầu tiên của mỗi giá trị là không trùng lặp.
Phương thức này không đánh dấu một hàng là trùng lặp nếu nó tồn tại nhiều hơn một lần, mà nó đánh dấu mỗi hàng tiếp theo sau hàng đầu tiên là trùng lặp. Ví dụ: nếu có 3 quả táo trong giỏ, phương thức này sẽ đánh dấu quả táo đầu tiên là không trùng lặp và hai quả còn lại là trùng lặp.
Ví dụ minh họa
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
Để trích xuất các hàng trùng lặp (nhớ rằng lần xuất hiện đầu tiên không phải là trùng lặp, các lần xuất hiện tiếp theo mới là trùng lặp và sẽ được phương thức này trả về), chúng ta truyền phương thức này vào DataFrame:
df.shape
(310, 4)
df[df["Employee_Name"].duplicated()]
Kết quả trả về 79 hàng trùng lặp từ tổng số 310 hàng:
| Employee_Name | Position | CitizenDesc | PerformanceScore | |
|---|---|---|---|---|
| 1 | Adinolfi | Sr. DBA | US Citizen | Fully Meets |
| 2 | Adinolfi | Production Technician II | US Citizen | Fully Meets |
| 3 | Adinolfi | Production Technician I | US Citizen | Fully Meets |
| 4 | Adinolfi | Production Manager | US Citizen | Fully Meets |
| 6 | Anderson | Production Technician I | US Citizen | Exceeds |
| ... | ... | ... | ... | ... |
| 303 | Wang | Production Technician II | US Citizen | Fully Meets |
| 304 | Wang | Production Technician II | US Citizen | Fully Meets |
| 305 | Wang | Production Technician I | US Citizen | PIP |
| 306 | Wang | CIO | US Citizen | Exceeds |
| 307 | Wang | Data Analyst | US Citizen | Fully Meets |
Tham số keep="last"
Mặc định, phương thức đánh dấu lần xuất hiện đầu tiên là không trùng lặp. Chúng ta có thể thay đổi hành vi này bằng cách truyền tham số keep="last".
Tham số này sẽ đánh dấu hai quả táo đầu tiên là trùng lặp và quả táo cuối cùng là không trùng lặp.
df[df["Employee_Name"].duplicated(keep="last")]
Kết quả sẽ bao gồm hàng đầu tiên (Adinolfi - Production Technician I) và loại bỏ hàng cuối cùng của mỗi nhóm trùng lặp.
Tham số keep=False
Tham số keep cũng chấp nhận giá trị False (không dùng ngoặc đơn) để đánh dấu tất cả các giá trị xuất hiện nhiều hơn một lần là trùng lặp. Trong ví dụ của chúng ta, cả 3 quả táo đều sẽ được đánh dấu là trùng lặp.
Lưu ý: Khi chỉ định tham số false, không sử dụng dấu ngoặc đơn.
df[df["Employee_Name"].duplicated(keep=False)]
Kết quả sẽ bao gồm tất cả các hàng có tên nhân viên trùng lặp (bao gồm cả hàng đầu tiên).
Trích xuất các giá trị duy nhất
Cuối cùng, để trích xuất các giá trị duy nhất từ bộ dữ liệu, chúng ta có thể sử dụng toán tử ~ (tilde) để phủ định kết quả:
df_unique = ~df["Employee_Name"].duplicated(keep=False) df[df_unique]
Kết quả trả về các hàng có tên nhân viên chỉ xuất hiện một lần duy nhất.
Phương thức drop_duplicates()
Phương thức này khá tương tự với phương thức trước, tuy nhiên nó hoạt động trên toàn bộ DataFrame thay vì trên một Series đơn lẻ.
LƯU Ý: Phương thức này tìm kiếm các hàng trùng lặp trên tất cả các cột của DataFrame và xóa chúng.
len(df)
310
len(df.drop_duplicates())
290
Tham số subset
Tham số subset chấp nhận một danh sách tên cột (dưới dạng chuỗi) để kiểm tra trùng lặp chỉ trên các cột đó.
df1 = df.drop_duplicates(subset=["Employee_Name"], keep="first") df1
Chúng ta có thể chỉ định nhiều cột và sử dụng tất cả các tham số keep đã thảo luận ở trên.
df1 = df.drop_duplicates(subset=["Employee_Name", "CitizenDesc"], keep=False) df1
Phương thức unique()
Phương thức unique() tìm các giá trị duy nhất trong một Series và trả về dưới dạng mảng (Array). Phương thức này không loại trừ các giá trị thiếu (missing values).
len(df["Employee_Name"])
310
df["Employee_Name"].unique()
Trả về mảng chứa 231 giá trị duy nhất.
len(df["Employee_Name"].unique())
231
Phương thức nunique()
Phương thức này trả về số lượng giá trị duy nhất trong một Series. Mặc định nó loại trừ các giá trị thiếu thông qua tham số dropna=True.
Bạn có thể truyền False cho tham số dropna để không loại bỏ giá trị thiếu.
df["Employee_Name"].nunique()
231
df["Employee_Name"].nunique(dropna=False)
231