Python
 Computer >> コンピューター >  >> プログラミング >> Python

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列


  1. Python-PandasIndexがカテゴリデータを保持しているかどうかを確認します

    Pandas Indexがカテゴリデータを保持しているかどうかを確認するには、 index.is_categorical()を使用します パンダのメソッド。まず、必要なライブラリをインポートします- import pandas as pd タイプをカテゴリに設定してPandasインデックスを作成する astype()を使用する メソッド- index = pd.Index(["Electronics","Accessories","Furniture"]).astype("category") パンダのイン

  2. 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