Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python Pandas에서 인덱스 레이블로 데이터의 하위 집합을 선택하는 방법은 무엇입니까?

<시간/>

소개

Pandas에는 인덱스 위치를 사용하거나 인덱스 레이블을 사용하여 데이터 하위 집합을 선택하는 이중 선택 기능이 있습니다. 이 게시물에서는 인덱스 레이블을 사용하여 "색인 레이블을 사용하여 데이터의 하위 집합 선택"하는 방법을 보여 드리겠습니다.

파이썬 사전과 목록은 인덱스 레이블이나 byindex 위치를 사용하여 데이터를 선택하는 내장 데이터 구조라는 것을 기억하십시오. 사전의 키는 문자열, 정수 또는 튜플이어야 하며 목록은 정수(위치) 또는 선택을 위해 슬라이스 객체를 사용해야 합니다.

판다에는 고유한 방식으로 인덱스 작업을 수행하는 데 사용할 수 있는 .loc 및 .iloc 속성이 있습니다. ). .iloc 속성을 사용하면 팬더는 위치로만 선택하고 Python 목록과 유사하게 작동합니다. .loc 속성은 파이썬 사전이 작동하는 방식과 유사한 인덱스 레이블로만 선택합니다.

.loc[]과 함께 색인 레이블을 사용하여 데이터의 하위 집합 선택

loc 및 iloc 속성은 Series 및 DataFrame 모두에서 사용할 수 있습니다.

1. 제목을 색인으로 하여 영화 데이터세트를 가져옵니다.

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"])

특히 인덱스가 문자열로 구성된 경우 항상 인덱스를 정렬하는 것이 좋습니다. 인덱스가 정렬될 때 거대한 데이터 세트를 처리하는 경우 차이점을 알 수 있습니다.

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

sort_index 및 "inplace =True" 매개변수를 사용하여 인덱스를 정렬했습니다.

1. loc 메서드의 구문에서 흥미로운 점은 괄호()를 사용하지 않고 대괄호[]를 사용한다는 것입니다. (틀릴 수 있음) 이것이 일관성을 원했기 때문이라고 생각합니다. 즉, Series에서 []를 사용하여 행을 추출할 수 있고 Dataframe에 적용하면 열을 가져올 수 있습니다.

# 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. 슬라이스를 사용하여 많은 값을 가져옵니다. 안본 영화를 뽑아봅니다. 이것은 문자열 레이블이기 때문에 "아바타"를 포함한 검색 기준에 대한 모든 데이터를 가져올 것입니다.

기억하십시오 - Python List로 작업하는 경우 마지막 값은 제외되지만 문자열로 작업하기 때문에 포함됩니다.

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행 × 3열

1. 나란히 있지 않은 두 개 이상의 임의 영화를 가져올 수 있습니까? 물론 그렇습니다. 하지만 필요한 영화 목록을 전달하는 데 더 많은 노력을 기울여야 합니다.

내 말은 대괄호 안에 대괄호가 있어야 한다는 것입니다.

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. 선택 순서를 변경할 수 있나요? 물론 주문에 필요한 라벨 목록을 지정하면 도움이 될 수 있습니다.

추출하려는 레이블 목록을 지정하는 것이 멋져 보이지만 값의 철자를 잘못 입력하면 어떻게 되는지 알고 계십니까? Pandas는 철자가 잘못된 레이블에 대해 누락된 값(NaN)을 멈췄을 것입니다. 하지만 그런 시절은 지나갔고 최신 업데이트로 예외가 발생했습니다.

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:'레이블이 누락된 .loc 또는 []에 목록 좋아요를 전달하는 것은 더 이상 지원되지 않습니다. https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex를 참조하세요. -listlike'

주의하는 한 가지 방법은 인덱스의 값을 직접 확인하는 것입니다.

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

출력

False

오류를 무시하고 계속 진행하려면 아래 접근 방식을 사용할 수 있습니다.

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


budget vote_average vote_count
title
Avatar 237000000 7.2 11800