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
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)
| budget | vote_average | vote_count | |
|---|---|---|---|
| titile | |||
| 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 |
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
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 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'
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
Bây giờ dữ liệu của chúng ta đã 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.
| budget | vote_average | vote_count | |
|---|---|---|---|
| title | |||
| Abandon | 25000000 | 4.6 | 45 |
| Abandoned | 0 | 5.8 | 27 |
| Abduction | 35000000 | 5.6 | 961 |
| Aberdeen | 0 | 7.0 | 6 |
| About Last Night | 12500000 | 6.0 | 210 |
| ... | ... | ... | ... |
| Battle for the Planet of the Apes | 1700000 | 5.5 | 215 |
| Battle of the Year | 20000000 | 5.9 | 88 |
| Battle: Los Angeles | 70000000 | 5.5 | 1448 |
| Battlefield Earth | 44000000 | 3.0 | 255 |
| Battleship | 209000000 | 5.5 | 2114 |
292 hàng × 3 cột
True
| title | budget | vote_average | vote_count |
|---|---|---|---|
| Æon Flux | 62000000 | 5.4 | 703 |
| xXx: State of the Union | 60000000 | 4.7 | 549 |
| xXx | 70000000 | 5.8 | 1424 |
| eXistenZ | 15000000 | 6.7 | 475 |
| [REC]² | 5600000 | 6.4 | 489 |
budget vote_average vote_count title
Điều này dễ hiểu vì nhận được DataFrame rỗng do 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.
| title | budget | vote_average | vote_count |
|---|---|---|---|
| B-Girl | 0 | 5.5 | 7 |
| Ayurveda: Art of Being | 300000 | 5.5 | 3 |
| Away We Go | 17000000 | 6.7 | 189 |
| Awake | 86000000 | 6.3 | 395 |
| Avengers: Age of Ultron | 280000000 | 7.3 | 6767 |
| ... | ... | ... | ... |
| About Last Night | 12500000 | 6.0 | 210 |
| Aberdeen | 0 | 7.0 | 6 |
| Abduction | 35000000 | 5.6 | 961 |
| Abandoned | 0 | 5.8 | 27 |
| Abandon | 25000000 | 4.6 | 45 |
228 hàng × 3 cột