Khóa học
Loại bỏ trùng lặp là kỹ năng thiết yếu để có số liệu thống kê chính xác, vì bạn thường không muốn đếm cùng một đối tượng nhiều lần. Trong Python, bạn có thể thực hiện điều này bằng mô-đun Pandas, với phương thức drop_duplicates.
Hãy cùng tìm hiểu cách sử dụng qua một vài ví dụ.
Loại bỏ tên trùng lặp
Giả sử bạn có một dataframe chứa các lần khám thú y, và phòng khám muốn biết có bao nhiêu chú chó của mỗi giống đã đến khám. Tuy nhiên, có những chú chó như Max và Stella đã đến khám nhiều hơn một lần trong tập dữ liệu. Do đó, bạn không thể chỉ đếm số lượng mỗi giống trong cột giống chó.
print(vet_visits)
date name breed weight_kg
0 2018-09-02 Bella Labrador 24.87
1 2019-06-07 Max Labrador 28.35
2 2018-01-17 Stella Chihuahua 1.51
3 2019-10-19 Lucy Chow Chow 24.07
.. ... ... ... ...
71 2018-01-20 Stella Chihuahua 2.83
72 2019-06-07 Max Chow Chow 24.01
73 2018-08-20 Lucy Chow Chow 24.40
74 2019-04-22 Max Labrador 28.54
Để làm được điều này, bạn sẽ loại bỏ các hàng có tên chó đã xuất hiện trước đó, hay nói cách khác, bạn sẽ chỉ giữ lại một hàng cho mỗi tên chó trong tập dữ liệu.
Bạn có thể dùng phương thức drop_duplicates. Nó nhận tham số subset, là cột mà ta muốn tìm trùng lặp dựa trên đó — trong trường hợp này, ta muốn tất cả các tên duy nhất.
vet_visits.drop_duplicates(subset="name")
date name breed weight_kg
0 2018-09-02 Bella Labrador 24.87
1 2019-06-07 Max Chow Chow 24.01
2 2019-03-19 Charlie Poodle 24.95
3 2018-01-17 Stella Chihuahua 1.51
4 2019-10-19 Lucy Chow Chow 24.07
7 2019-03-30 Cooper Schnauzer 16.91
10 2019-01-04 Bernie St. Bernard 74.98
(6 2019-06-07 Max Labrador 28.35)
Nhưng nếu có những chú chó trùng tên thì sao?
Loại bỏ các cặp trùng lặp
Trong trường hợp đó, khi loại bỏ trùng lặp, ta cần xét nhiều hơn chỉ cột name. Vì hai mục Max thuộc các giống khác nhau, ta có thể loại bỏ các hàng có cặp giá trị tên và giống đã xuất hiện trước đó trong tập dữ liệu.
unique_dogs = vet_visits.drop_duplicates(subset=["name", "breed"])
print(unique_dogs)
date name breed weight_kg
0 2018-09-02 Bella Labrador 24.87
1 2019-03-13 Max Chow Chow 24.13
2 2019-03-19 Charlie Poodle 24.95
3 2018-01-17 Stella Chihuahua 1.51
4 2019-10-19 Lucy Chow Chow 24.07
6 2019-06-07 Max Labrador 28.35
7 2019-03-30 Cooper Schnauzer 16.91
10 2019-01-04 Bernie St. Bernard 74.98
Để dựa trên nhiều cột khi xác định trùng lặp, ta truyền một danh sách tên cột vào tham số subset, ở đây là name và breed.
Bây giờ cả hai mục Max đều đã được giữ lại.
Ví dụ tương tác
Trong bài tập này, bạn sẽ tạo một số DataFrame mới từ các giá trị duy nhất của sales. sales đã được cung cấp, và pandas đã được nhập với tên pd.
Bạn sẽ thực hiện các bước sau:
- Đầu tiên, loại bỏ các hàng của
salescó cặpstorevàtypetrùng lặp, lưu thànhstore_typesvà in phần đầu. - Sau đó, loại bỏ các hàng của
salescó cặpstorevàdepartmenttrùng lặp, lưu thànhstore_deptsvà in phần đầu. - Lọc các hàng là tuần nghỉ lễ và loại bỏ các
datetrùng lặp, lưu thànhholiday_dates. - Cuối cùng, chọn cột
datecủaholiday_datesvà in dataframeholiday_dates.
# Drop duplicate store/type combinations
store_types = sales.drop_duplicates(subset=["store", "type"])
print(store_types.head())
# Drop duplicate store/department combinations
store_depts = sales.drop_duplicates(subset=["store", "department"])
print(store_depts.head())
# Subset the rows that are holiday weeks and drop duplicate dates
holiday_dates = sales[sales["is_holiday"]].drop_duplicates(subset="date")
# Print date col of holiday_dates
print(holiday_dates["date"])
Khi chạy đoạn mã trên, bạn sẽ nhận được kết quả sau:
store type department date weekly_sales is_holiday temperature_c fuel_price_usd_per_l unemployment
0 1 A 1 2010-02-05 24924.50 False 5.728 0.679 8.106
901 2 A 1 2010-02-05 35034.06 False 4.550 0.679 8.324
1798 4 A 1 2010-02-05 38724.42 False 6.533 0.686 8.623
2699 6 A 1 2010-02-05 25619.00 False 4.683 0.679 7.259
3593 10 B 1 2010-02-05 40212.84 False 12.411 0.782 9.765
store type department date weekly_sales is_holiday temperature_c fuel_price_usd_per_l unemployment
0 1 A 1 2010-02-05 24924.50 False 5.728 0.679 8.106
12 1 A 2 2010-02-05 50605.27 False 5.728 0.679 8.106
24 1 A 3 2010-02-05 13740.12 False 5.728 0.679 8.106
36 1 A 4 2010-02-05 39954.04 False 5.728 0.679 8.106
48 1 A 5 2010-02-05 32229.38 False 5.728 0.679 8.106
498 2010-09-10
691 2011-11-25
2315 2010-02-12
6735 2012-09-07
6810 2010-12-31
6815 2012-02-10
6820 2011-09-09
Name: date, dtype: datetime64[ns]
Để tìm hiểu thêm về đếm và tổng hợp dữ liệu, vui lòng xem video từ khóa học Data Manipulation with pandas của chúng tôi.
Nội dung này được trích từ khóa học Data Manipulation with pandas của DataCamp do Maggie Matsui và Richie Cotton biên soạn.