소개
Pandas에는 인덱스 위치를 사용하거나 인덱스 레이블을 사용하여 데이터 하위 집합을 선택하는 이중 선택 기능이 있습니다. 이 게시물에서는 "사전 슬라이싱을 사용하여 데이터 부분 집합 선택" 방법을 보여 드리겠습니다.
Google은 데이터 세트로 가득 차 있습니다. kaggle.com에서 영화 데이터세트를 검색합니다. 이 게시물은 kaggle의 영화 데이터 세트를 사용합니다.
방법
1. 이 예에 필요한 열만 있는 영화 데이터세트를 가져옵니다.
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)
제목 | 예산 | 투표 평균 | vote_count |
---|---|---|---|
작은 목소리 | 0 | 6.6 | 61 |
어른 2 | 80000000 | 5.8 | 1155 |
우리 생애 최고의 해 | 2100000 | 7.6 | 143 |
엄니 | 2800000 | 5.1 | 366 |
크로마이트 작전 | 0 | 5.8 | 29 |
2. 특히 인덱스가 문자열로 구성된 경우 항상 인덱스를 정렬하는 것이 좋습니다. 인덱스가 정렬될 때 거대한 데이터 세트를 처리하는 경우 차이점을 알 수 있습니다.
색인을 정렬하지 않으면 어떻게 됩니까?
문제 없습니다. 코드가 영원히 실행될 것입니다. 농담입니다. 인덱스 레이블이 정렬되지 않은 경우 팬더는 쿼리와 일치하도록 모든 레이블을 하나씩 탐색해야 합니다. 색인 페이지가 없는 옥스포드 사전을 상상해 보십시오. 어떻게 하시겠습니까? 색인이 정렬되면 추출하려는 레이블로 빠르게 이동할 수 있으며 Pandastoo의 경우도 마찬가지입니다.
색인이 정렬되었는지 여부를 먼저 확인하겠습니다.
# check if the index is sorted or not ? movies.index.is_monotonic False
3. 분명히 인덱스가 정렬되지 않았습니다. A%로 시작하는 영화를 선택하려고 합니다. 이것은 글쓰기와 같습니다.
select * from movies where title like'A%'
movies.loc["Aa":"Bb"]
--------------------------------------------------------------------------- ValueErrorTraceback (most recent call last) ~\anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_slice_bound(self, labe l, side, kind) 4844try: -> 4845return self._searchsorted_monotonic(label, side) 4846except ValueError: ~\anaconda3\lib\site-packages\pandas\core\indexes\base.py in _searchsorted_monotonic(se lf, label, side) 4805 -> 4806raise ValueError("index must be monotonic increasing or decreasing") 4807 ValueError: index must be monotonic increasing or decreasing During handling of the above exception, another exception occurred: KeyErrorTraceback (most recent call last) in ----> 1 movies.loc["Aa": "Bb"] ~\anaconda3\lib\site-packages\pandas\core\indexing.py in getitem (self, key) 1766 1767maybe_callable = com.apply_if_callable(key, self.obj) -> 1768return self._getitem_axis(maybe_callable, axis=axis) 1769 1770def _is_scalar_access(self, key: Tuple): ~\anaconda3\lib\site-packages\pandas\core\indexing.py in _getitem_axis(self, key, axis) 1910if isinstance(key, slice): 1911self._validate_key(key, axis) -> 1912return self._get_slice_axis(key, axis=axis) 1913elif com.is_bool_indexer(key): 1914return self._getbool_axis(key, axis=axis) ~\anaconda3\lib\site-packages\pandas\core\indexing.py in _get_slice_axis(self, slice_ob j, axis) 1794 1795labels = obj._get_axis(axis) -> 1796indexer = labels.slice_indexer( 1797slice_obj.start, slice_obj.stop, slice_obj.step, kind=self.name 1798) ~\anaconda3\lib\site-packages\pandas\core\indexes\base.py in slice_indexer(self, start, end, step, kind) 4711slice(1, 3) 4712""" -> 4713start_slice, end_slice = self.slice_locs(start, end, step=step, kind=ki nd) 4714 4715# return a slice ~\anaconda3\lib\site-packages\pandas\core\indexes\base.py in slice_locs(self, start, en d, step, kind) 4924start_slice = None 4925if start is not None: -> 4926start_slice = self.get_slice_bound(start, "left", kind) 4927if start_slice is None: 4928start_slice = 0 ~\anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_slice_bound(self, labe l, side, kind) 4846except ValueError: 4847# raise the original KeyError -> 4848raise err 4849 4850if isinstance(slc, np.ndarray): ~\anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_slice_bound(self, labe l, side, kind) 4840# we need to look up the label 4841try: -> 4842slc = self.get_loc(label) 4843except KeyError as err: 4844try: ~\anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance) 2646return self._engine.get_loc(key) 2647except KeyError: -> 2648return self._engine.get_loc(self._maybe_cast_indexer(key)) 2649indexer = self.get_indexer([key], method=method, tolerance=tolerance) 2650if indexer.ndim > 1 or indexer.size > 1: pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas\_libs\index.pyx in pandas._libs.index.IndexEngine._get_loc_duplicates() pandas\_libs\index.pyx in pandas._libs.index.IndexEngine._maybe_get_bool_indexer() KeyError: 'Aa'
4. 인덱스를 오름차순으로 정렬하고 동일한 명령을 시도하여 사전순 슬라이싱 정렬을 활용합니다.
True
5. 이제 데이터가 설정되고 사전식 슬라이싱을 위한 준비가 되었습니다. 이제 A부터 B까지 모든 영화 제목을 선택하겠습니다.
제목 | 예산 | 투표 평균 | vote_count |
---|---|---|---|
포기 | 25000000 | 4.6 | 45 |
포기됨 | 0 | 5.8 | 27 |
납치 | 35000000 | 5.6 | 961 |
애버딘 | 0 | 7.0 | 6 |
어젯밤 정보 | 12500000 | 6.0 | 210 |
... | ... | ... | ... |
유인원의 행성을 위한 전투 | 1700000 | 5.5 | 215 |
올해의 전투 | 20000000 | 5.9 | 88 |
전투:로스앤젤레스 | 70000000 | 5.5 | 1448 |
전장 지구 | 44000000 | 3.0 | 255 |
전함 | 209000000 | 5.5 | 2114 |
제목 | 예산 | 투표 평균 | vote_count |
---|---|---|---|
플럭스에 대한 | 62000000 | 5.4 | 703 |
xXx:연방 공화국 | 60000000 | 4.7 | 549 |
xXx | 70000000 | 5.8 | 1424 |
존재함 | 15000000 | 6.7 | 475 |
[REC]² | 5600000 | 6.4 | 489 |
예산 vote_average vote_count 제목
데이터가 역순으로 정렬될 때 빈 DataFrame을 보는 것은 어렵지 않습니다. 문자를 반대로 하여 다시 실행해 보겠습니다.
제목 | 예산 | 투표 평균 | vote_count |
---|---|---|---|
비걸 | 0 | 5.5 | 7 |
아유르베다:존재의 예술 | 300000 | 5.5 | 3 |
고향 | 17000000 | 6.7 | 189 |
깨어 있음 | 86000000 | 6.3 | 395 |
어벤져스:에이지 오브 울트론 | 280000000 | 7.3 | 6767 |
... | ... | ... | ... |
어젯밤 정보 | 12500000 | 6.0 | 210 |
애버딘 | 0 | 7.0 | 6 |
납치 | 35000000 | 5.6 | 961 |
포기됨 | 0 | 5.8 | 27 |
포기 | 25000000 | 4.6 | 45 |