Python Pandasで辞書式順序スライスを使用してデータのサブセットを選択するにはどうすればよいですか?
はじめに
パンダには、インデックス位置またはインデックスラベルを使用してデータのサブセットを選択するための二重選択機能があります。この投稿では、「辞書式順序のスライスを使用してデータのサブセットを選択する」方法を紹介します。
Googleはデータセットでいっぱいです。 kaggle.comで映画データセットを検索します。この投稿では、kaggleの映画データセットを使用しています。
方法
-
この例に必要な列のみを含む映画データセットをインポートします。
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_average | vote_count |
---|---|---|---|
タイトル | | | |
小さな声 | 0 | 6.6 | 61 |
Growth Ups 2 | 80000000 | 5.8 | 1155 |
私たちの人生の最高の年 | 2100000 | 7.6 | 143 |
タスク | 2800000 | 5.1 | 366 |
クロマイト作戦 | 0 | 5.8 | 29 |
-
特にインデックスが文字列で構成されている場合は、インデックスを並べ替えることを常にお勧めします。インデックスを並べ替えるときに巨大なデータセットを扱う場合は、違いに気付くでしょう。
インデックスを並べ替えないとどうなりますか?
コードが永久に実行されることは問題ありません。冗談ですが、インデックスラベルが並べ替えられていない場合、パンダはクエリに一致するようにすべてのラベルを1つずつトラバースする必要があります。インデックスページのないオックスフォード辞書を想像してみてください。あなたは何をしようとしているのでしょうか。インデックスを並べ替えると、抽出したいラベルにすばやくジャンプできます。Pandastooの場合もそうです。
まず、インデックスが並べ替えられているかどうかを確認しましょう。
# check if the index is sorted or not ? movies.index.is_monotonic
誤り
-
明らかに、インデックスはソートされていません。 A%で始まる映画を選択しようとします。これは書くようなものです
「A%」のようなタイトルの映画から*を選択
movies.loc["Aa":"Bb"]
select * from movies where title like 'A%' --------------------------------------------------------------------------- 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'
-
インデックスを昇順で並べ替え、同じコマンドを試して、辞書式順序の並べ替えを利用します。
True
-
これで、データが設定され、辞書式順序でスライスできるようになりました。ここで、文字Aから文字Bまでのすべての映画タイトルを選択しましょう。
| 予算 | vote_average | 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 |
292行×3列
正しい
title | 予算 | vote_average | vote_count |
---|---|---|---|
ÆonFlux | 62000000 | 5.4 | 703 |
xXx:連合国 | 60000000 | 4.7 | 549 |
xXx | 70000000 | 5.8 | 1424 |
eXistenZ | 15000000 | 6.7 | 475 |
[REC]² | 5600000 | 6.4 | 489 |
予算vote_averagevote_countタイトル
データは逆の順序で並べ替えられるため、これは空のDataFrameを確認するのに簡単です。文字を逆にして、これをもう一度実行しましょう。
title | 予算 | vote_average | vote_count |
---|---|---|---|
B-Girl | 0 | 5.5 | 7 |
アーユルヴェーダ:アートオブビーイング | 300000 | 5.5 | 3 |
Away We Go | 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 |
228行×3列
-
Python-PandasIndexがカテゴリデータを保持しているかどうかを確認します
Pandas Indexがカテゴリデータを保持しているかどうかを確認するには、 index.is_categorical()を使用します パンダのメソッド。まず、必要なライブラリをインポートします- import pandas as pd タイプをカテゴリに設定してPandasインデックスを作成する astype()を使用する メソッド- index = pd.Index(["Electronics","Accessories","Furniture"]).astype("category") パンダのイン
-
Python-PandasDataFrameのサブセットを選択する方法
以下は、MicrosoftExcelで開いたCSVファイルの内容であるとしましょう- 最初に、CSVファイルからPandasDataFrameにデータをロードします- dataFrame = pd.read_csv("C:\\Users\\amit_\\Desktop\\SalesData.csv") サブセットを選択するには、角かっこを使用します。括弧内の列に言及し、データセット全体から単一の列をフェッチします- dataFrame['Car'] 例 以下はコードです- import pandas as pd # Load data fr