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 nhãn chỉ mục" sử dụng thuộc tính .loc[].
Hãy nhớ rằng, từ điển (dictionary) và danh sách (list) là các cấu trúc dữ liệu tích hợp sẵn của Python, chọn dữ liệu của chúng hoặc bằng nhãn chỉ mục hoặc bằng vị trí chỉ mục. Khóa của từ điển phải là chuỗi, số nguyên hoặc tuple, trong khi danh sách phải sử dụng số nguyên (vị trí) hoặc đối tượng slice để chọn.
Pandas cung cấp các thuộc tính .loc và .iloc để thực hiện các thao tác chỉ mục theo cách riêng của chúng. Với thuộc tính .iloc, pandas chỉ chọn theo vị trí và hoạt động tương tự như danh sách Python. Thuộc tính .loc chọn chỉ theo nhãn chỉ mục, tương tự như cách từ điển Python hoạt động.
Chọn tập con dữ liệu bằng nhãn chỉ mục với .loc[]
Các thuộc tính loc và iloc có sẵn trên cả Series và DataFrame.
1. Nhập bộ dữ liệu phim với title làm chỉ mục.
import pandas as pd
movies = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv",
index_col="title",
usecols=["title", "budget", "vote_average", "vote_count"])
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.
movies.sort_index(inplace=True) movies.head(3)
budget vote_average vote_count title #Horror 1500000 3.3 52 (500) Days of Summer 7500000 7.2 2904 10 Cloverfield Lane 15000000 6.8 2468
Tôi đã sắp xếp chỉ mục sử dụng sort_index với tham số inplace=True.
2. Một điểm thú vị về cú pháp của phương thức loc là nó không sử dụng dấu ngoặc đơn () mà sử dụng dấu ngoặc vuông []. Tôi nghĩ (có thể sai) điều này là để đảm bảo tính nhất quán: bạn có thể dùng [] trên Series để trích xuất hàng, trong khi áp dụng trên DataFrame sẽ lấy cột.
# trích xuất "Spider-Man 3" (tôi không phải fan lớn của Spidy) movies.loc["Spider-Man 3"]
budget 258000000.0 vote_average 5.9 vote_count 3576.0 Name: Spider-Man 3, dtype: float64
3. Sử dụng slice để lấy nhiều giá trị. Tôi sẽ lấy các phim mà tôi chưa xem. Vì đây là nhãn chuỗi, chúng ta sẽ lấy tất cả dữ liệu cho tiêu chí tìm kiếm bao gồm cả "Avatar".
Lưu ý: Nếu bạn làm việc với Python List, giá trị cuối cùng bị loại trừ, nhưng vì chúng ta làm việc với chuỗi nên nó bao gồm cả giá trị cuối.
movies.loc["Alien":"Avatar"]
budget vote_average vote_count title Alien 11000000 7.9 4470 Alien Zone 0 4.0 3 Alien: Resurrection 70000000 5.9 1365 Aliens 18500000 7.7 3220 Aliens in the Attic 45000000 5.3 244 ... ... ... ... Australia 130000000 6.3 694 Auto Focus 7000000 6.1 56 Automata 7000000 5.6 670 Autumn in New York 65000000 5.7 135 Avatar 237000000 7.2 11800
167 hàng × 3 cột
4. Có thể lấy hai hoặc nhiều phim ngẫu nhiên không liền kề nhau không? Chắc chắn được, nhưng bạn cần nỗ lực hơn một chút bằng cách truyền một danh sách các phim bạn cần.
Ý tôi là bạn cần có dấu ngoặc vuông bên trong dấu ngoặc vuông.
movies.loc[["Avatar", "Avengers: Age of Ultron"]]
budget vote_average vote_count title Avatar 237000000 7.2 11800 Avengers: Age of Ultron 280000000 7.3 6767
5. Có thể thay đổi thứ tự chọn lọc không? Tất nhiên, bạn có thể tự giúp mình bằng cách chỉ định danh sách nhãn bạn cần theo một thứ tự.
Mặc dù việc chỉ định danh sách nhãn bạn muốn trích xuất trông rất hay, nhưng bạn có biết điều gì xảy ra nếu bạn đánh vần sai một giá trị? Pandas trước đây sẽ điền giá trị thiếu (NaN) cho nhãn sai. Nhưng những ngày đó đã qua, với các bản cập nhật mới nhất, nó ném ra ngoại lệ (exception).
movies.loc[["Avengers: Age of Ultron", "Avatar", "When is Avengers next movie?"]]
KeyError: 'Passing list-likes to .loc or [] with any missing labels is no longer supported, see https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike'
Một cách để xử lý là kiểm tra giá trị trong chỉ mục trực tiếp:
"When is Avengers next movie?" in movies.index
False
Nếu bạn muốn bỏ qua lỗi và tiếp tục, bạn có thể sử dụng phương pháp sau:
movies.query("title in ('Avatar', 'When is Avengers next Movie?')")
budget vote_average vote_count title Avatar 237000000 7.2 11800