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

Python Pandasでインデックスラベルを使用してデータのサブセットを選択するにはどうすればよいですか?


はじめに

パンダには、インデックス位置またはインデックスラベルを使用してデータのサブセットを選択するための二重選択機能があります。この投稿では、インデックスラベルを使用して「インデックスラベルを使用してデータのサブセットを選択する」方法を紹介します。

Pythonディクショナリとリストは、インデックスラベルまたはインデックス位置のいずれかを使用してデータを選択する組み込みのデータ構造であることを忘れないでください。辞書のキーは文字列、整数、またはタプルである必要がありますが、リストは選択に整数(位置)またはスライスオブジェクトを使用する必要があります。

パンダには、独自の方法でインデックス操作を実行するために使用できる.loc属性と.iloc属性があります。 )。 .iloc属性を使用すると、パンダは位置によってのみ選択し、Pythonリストと同様に機能します。 .loc属性は、Pythonディクショナリの動作と同様に、インデックスラベルによってのみ選択されます。

.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メソッドの構文について興味深いことの1つは、括弧()を使用せず、squarebrackets[]を使用することです。これは、一貫性が必要だったためだと思います。つまり、シリーズで[]を使用して行を抽出し、データフレームに適用すると列が取得されます。

# 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リストを使用している場合、最後の値は除外されますが、文字列を使用しているため、これが含まれます。

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.隣り合っていない2つ以上のランダムな映画を入手できますか?確かにそうですが、必要な映画のリストを渡すことにもっと努力する必要があります。

私が言いたかったのは、角かっこを角かっこで囲む必要があるということでした。

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.選択の順序を変更できますか?もちろん、注文に必要なラベルのリストを指定することで、自分自身を助けることができます。

抽出するラベルのリストを指定するのはクールに見えますが、値のスペルを間違えた場合はどうなるか知っていますか?パンダは、スペルが間違っているラベルの欠落値(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または[]へのlist-likesの受け渡しはサポートされなくなりました。https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindexを参照してください。 -listlike'

注意を払う1つの方法は、インデックスの値を直接チェックすることです。

"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

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

  2. Python-Pandas .query()メソッドを使用したデータのフィルタリング

    Pandasは、データクレンジング、データ分析などに非常に広く使用されているPythonライブラリです。この記事では、クエリメソッドを使用して特定のデータセットから特定のデータをフェッチする方法を説明します。クエリ内に単一の条件と複数の条件の両方を含めることができます。 データの読み取り まず、pandasライブラリを使用してデータをpandasデータフレームに読み込みます。以下のプログラムはそれを実行します。 例 import pandas as pd # Reading data frame from csv file data = pd.read_csv("D:\\hear