Giới thiệu
Pandas cung cấp khả năng chọn dữ liệu kép: theo vị trí chỉ mục (index position) hoặc theo nhãn chỉ mục (index labels). Trong bài viết này, tôi sẽ hướng dẫn cách "Chọn tập con dữ liệu bằng cắt theo từ điển" (lexicographical slicing).
Google đầy ắp các bộ dữ liệu. Tìm kiếm bộ dữ liệu phim trên kaggle.com. Bài viết này sử dụng bộ dữ liệu phim từ kaggle.
Cách thực hiện
1. Nhập bộ dữ liệu phim chỉ với các cột cần thiết cho ví dụ này.
import pandas as pd
import numpy as np
movies = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv",
index_col="title",
usecols=["title", "budget", "vote_average", "vote_count"])
movies.sample(n=5)
Kết quả mẫu ngẫu nhiên 5 phim:
| title | budget | vote_average | vote_count |
|---|---|---|---|
| Little Voice | 0 | 6.6 | 61 |
| Grown Ups 2 | 80000000 | 5.8 | 1155 |
| The Best Years of Our Lives | 2100000 | 7.6 | 143 |
| Tusk | 2800000 | 5.1 | 366 |
| Operation Chromite | 0 | 5.8 | 29 |
2. Tôi luôn khuyến khích sắp xếp chỉ mục, đặc biệt khi chỉ mục được tạo từ chuỗi ký tự. Bạn sẽ nhận thấy sự khác biệt nếu đang xử lý bộ dữ liệu lớn khi chỉ mục đã được sắp xếp.
Điều gì xảy ra nếu tôi không sắp xếp chỉ mục?
Không vấn đề gì, code của bạn sẽ chạy... mãi mãi. Đùa thôi, thực tế nếu các nhãn chỉ mục chưa được sắp xếp, pandas phải duyệt qua tất cả các nhãn một per một để khớp với truy vấn của bạn. Hãy tưởng tượng một từ điển Oxford không có trang chỉ mục, bạn sẽ làm gì? Với chỉ mục đã sắp xếp, bạn có thể nhảy nhanh đến nhãn mong muốn, pandas cũng hoạt động tương tự.
Hãy kiểm tra xem chỉ mục của chúng ta đã được sắp xếp hay chưa:
# kiểm tra xem chỉ mục đã được sắp xếp hay chưa? movies.index.is_monotonic # Kết quả: False
3. Rõ ràng chỉ mục chưa được sắp xếp. Chúng ta sẽ thử chọn các phim bắt đầu bằng chữ A%. Điều này tương đương với câu lệnh SQL:
select * from movies where title like 'A%'
movies.loc["Aa":"Bb"]
Lỗi xảy ra vì chỉ mục chưa đơn điệu (monotonic):
ValueError: index must be monotonic increasing or decreasing KeyError: 'Aa'
4. Sắp xếp chỉ mục theo thứ tự tăng dần và thử lại lệnh trên để tận dụng lợi thế của cắt theo từ điển.
movies.sort_index(inplace=True) movies.index.is_monotonic # Kết quả: True
5. Bây giờ dữ liệu đã sẵn sàng cho cắt theo từ điển. Hãy chọn tất cả các tiêu đề phim từ chữ A đến chữ B.
movies.loc["Aa":"Bb"]
Kết quả trả về 292 hàng từ "Abandon" đến "Battleship".
Cắt ngược (Reverse slicing)
Nếu thử cắt từ "Bb" đến "Aa" trên dữ liệu đã sắp xếp tăng dần, sẽ nhận được DataFrame rỗng vì dữ liệu được sắp xếp theo thứ tự ngược lại. Hãy đảo ngược thứ tự chữ cái và chạy lại.
movies.loc["Bb":"Aa"]
Kết quả trả về 228 hàng từ "B-Girl" ngược về "Abandon".