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

Python Pandas에서 사전 슬라이싱을 사용하여 데이터의 하위 집합을 선택하는 방법은 무엇입니까?

<시간/>

소개

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