Computer >> Máy Tính >  >> Lập trình >> Python

Làm cách nào để chọn tập hợp con dữ liệu với Nhãn chỉ mục trong Python Pandas?

Giới thiệu

Gấu trúc có khả năng lựa chọn kép để chọn tập hợp con dữ liệu bằng cách sử dụng vị trí Chỉ mục hoặc bằng cách sử dụng nhãn Chỉ mục. Trong bài đăng này, tôi sẽ chỉ cho bạn cách “Chọn Tập hợp Con Dữ liệu Sử dụng Nhãn Chỉ mục” bằng cách sử dụng nhãn chỉ mục.

Hãy nhớ rằng, danh sách và từ điển Python là cấu trúc dữ liệu tích hợp sẵn để chọn dữ liệu của chúng bằng cách sử dụng nhãn chỉ mục hoặc vị trí byindex. Khóa của từ điển phải là một chuỗi, số nguyên hoặc bộ trong khi Danh sách phải sử dụng số nguyên (vị trí) hoặc đối tượng lát cắt để lựa chọn.

Gấu trúc có các thuộc tính .loc và.iloc để thực hiện các thao tác lập chỉ mục theo những cách độc đáo của riêng chúng. ). Thuộc tính With.iloc, gấu trúc chỉ chọn theo vị trí và hoạt động tương tự như danh sách Python. Thuộc tính .loc chỉ chọn theo nhãn chỉ mục, tương tự như cách hoạt động của từ điển Python.

Chọn một tập hợp con dữ liệu bằng cách sử dụng nhãn chỉ mục với .loc []

Thuộc tính loc và iloc có sẵn trên cả Series và DataFrame

1.Nhập tập dữ liệu phim với tiêu đề là 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 bạn nên sắp xếp chỉ mục, đặc biệt nếu chỉ mục được tạo thành từ các chuỗi. Bạn sẽ nhận thấy sự khác biệt nếu bạn đang xử lý một tập dữ liệu lớn khi chỉ mục của bạn đượ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 bằng cách sử dụng tham số sort_index và "inplace =True".

1. Một điều 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à lấy dấu ngoặc vuông []. Tôi nghĩ (có thể sai) điều này là do họ muốn có tính nhất quán, tức là bạn có thể sử dụng [] trên Chuỗi để trích xuất, trong khi áp dụng trên Khung dữ liệu sẽ tìm nạp các cột cho bạn.

# extract "Spider-Man 3" ( I'm not a big fan of spidy)
movies.loc["Spider-Man 3"]


budget 258000000.0
vote_average 5.9
vote_count 3576.0
Name: Spider-Man 3, dtype: float64

1. Sử dụng một lát cắt để kéo ra nhiều giá trị. Tôi sẽ lấy những bộ phim mà tôi chưa xem. Bởi vì đây là một chuỗi, chúng tôi sẽ lấy tất cả dữ liệu cho các tiêu chí tìm kiếm của chúng tôi, bao gồm cả "Hình đại diện".

Hãy nhớ rằng - 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 tôi đang làm việc với chuỗi nên nó được bao gồm.

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

1. Tôi có thể nhận bất kỳ hai hoặc nhiều phim ngẫu nhiên không ở cạnh nhau không? Chắc chắn là có, nhưng bạn cần phải hiệu quả hơn để vượt qua danh sách các bộ phim bạn cần.

Ý tôi là bạn cần có dấu ngoặc vuông 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

6. Tôi có thể thay đổi thứ tự lựa chọn không? Tất nhiên, bạn có thể tự giúp mình bằng cách chỉ định danh sách các nhãn bạn cần trong một đơn đặt hàng.

Mặc dù điều này trông rất tuyệt khi chỉ định danh sách các nhãn bạn muốn trích xuất, nhưng bạn có biết điều gì sẽ xảy ra nếu bạn đánh vần sai một giá trị không? Gấu trúc có thể đã bị thiếu Giá trị (NaN) cho nhãn viết sai chính tả. Nhưng những ngày đó đã qua đi, với những bản cập nhật mới nhất, nó tạo ra một ngoại lệ.

movies.loc[["Avengers: Age of Ultron","Avatar","When is Avengers next movie?"]]


---------------------------------------------------------------------------
KeyError
Traceback (most recent call last)
<ipython-input-6-ebe975264840> in <module>
----> 1 movies.loc[["Avengers: Age of Ultron","Avatar","When is Avengers next movie?"]]

~\anaconda3\lib\site-packages\pandas\core\indexing.py in
__getitem__
(self, key)
1766
1767 maybe_callable = com.apply_if_callable(
key,self.obj)
-> 1768
return self._getitem_axis(maybe_callable,axis = axis)
1769
1770 def_is_scalar_access(self,key:Tuple):
~\anaconda3\lib\site-packages\pandas\core\indexing.py
in
_getitem_axis
(self, key, axis)
1952 raiseValueError("Cannot index with multidimensional key")
1953
-> 1954 return self._getitem_iterable(key,
axis=axis)
1955
1956 # nested tuple slicing
~\anaconda3\lib\site-packages\pandas\core\indexing.py
in_getitem_iterable(self, key, axis)
1593 else:
1594 # A collection of keys
-> 1595 keyarr,indexer=self._get_listlike_indexer(key,axis,raise_missing=False)
1596 return self.obj._reindex_with_indexers(
1597 {axis:[keyarr,indexer]},copy=True,allow_dups=True
~\anaconda3\lib\site-packages\pandas\core\indexing.py
in
_get_listlike_indexer(self, key, axis, raise_missing)
1550 keyarr,indexer,new_indexer=ax._reindex_non_unique
(keyarr)
1551
-> 1552 self._validate_read_indexer(
1553 keyarr,indexer,o._get_axis_number
(axis),raise_missing=raise_missing
1554 )
~\anaconda3\lib\site-packages\pandas\core\indexing.py
in
_validate_read_indexer
(self, key, indexer, axis, raise_missing)
1652 # just raising
1653 ifnot(ax.is_categorical()orax.is_interval()
)
:
-> 1654 raise KeyError(
1655 "Passing list-likes to .loc or [] with any missing labels "
1656 "is no longer supported, see "

KeyError:'Chuyển danh sách thích sang .loc hoặc [] với bất kỳ nhãn bị thiếu nào không còn được hỗ trợ nữa, hãy xem https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex -listlike '

Một cách để lưu ý là kiểm tra trực tiếp các giá trị trong chỉ mục.

"When is Avengers next movie?"in movies.index

Đầu ra

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 dưới đây

movies.query("title in ('Avatar','When is Avengers next Movie?')")


budget vote_average vote_count
title
Avatar 237000000 7.2 11800