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

【Pandas入門】.locでインデックスラベルを使ってデータの一部を抽出する方法

はじめに

Pandasには、インデックス位置(番号)またはインデックスラベルを使ってデータのサブセットを選択できる、2つの選択手段が用意されています。本記事では、後者の「インデックスラベルを使ったデータ抽出」の方法を、実例を交えながらわかりやすく解説します。

まず前提として、Pythonの組み込みデータ構造である辞書(dict)リスト(list)の挙動を思い出してください。辞書はキー(ラベル)でデータを選択し、リストは整数の位置またはスライスオブジェクトで選択します。辞書のキーは文字列・整数・タプルのいずれかである必要があります。

Pandasには、それぞれ独自の方法でインデックス操作を行うための .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 を指定して、インデックスをソートしました。

2. 単一の行を抽出する

loc メソッドの構文で興味深いのは、丸括弧 () ではなく角括弧 [] を使う点です。これは設計上の一貫性のためと考えられます。Series に [] を使うと行を抽出でき、DataFrame に適用すると列を取得できるようになっています。

# "Spider-Man 3" を抽出
movies.loc["Spider-Man 3"]
budget 258000000.0
vote_average 5.9
vote_count 3576.0
Name: Spider-Man 3, dtype: float64

3. スライスで複数の行をまとめて取得する

スライスを使えば、範囲内の多数の行を一度に取り出せます。ここでは「Alien」から「Avatar」までの映画を取得してみましょう。文字列ラベルの場合、検索条件の範囲にあるすべてのデータが返されます。

注意: 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 rows × 3 columns」となり、167件の映画データが取得できました。

4. 離れた場所にある複数の映画を抽出する

隣接していない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

5. 取得順序を自由に指定する

選択結果の順序を変えることもできます。必要なラベルを希望する順序でリストに並べて渡すだけです。

ところで、リスト内のラベルをタイプミスしたらどうなるでしょうか? 旧バージョンのPandasでは、存在しないラベルに対して欠損値(NaN)が割り当てられていました。しかし現在のバージョンでは、代わりに例外(KeyError)が発生するようになっています。

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?"]]
...
-> 1654 raise KeyError(
1655 "Passing list-likes to .loc or [] with any missing labels "
1656 "is no longer supported, see "

KeyError: 'Passing list-likes to .loc or [] with any missing labels is no longer supported'

このエラーへの対処法の一つは、事前にインデックス内に目的の値が存在するかを確認することです。

"When is Avengers next movie?" in movies.index

出力

False

エラーを回避しつつ処理を続けたい場合は、query メソッドを使う方法もあります。存在しないラベルは単純にスキップされ、該当する行だけが返されます。

movies.query("title in ('Avatar','When is Avengers next Movie?')")
budget vote_average vote_count
title
Avatar 237000000 7.2 11800

まとめ

本記事では、Pandasの .loc を使ったインデックスラベルによるデータ抽出について学びました。主なポイントは以下の通りです。

.loc["ラベル名"] で単一行を抽出できる
.loc["開始":"終了"] のスライスでは終了ラベルも含まれる
・離れた複数行は .loc[["A", "B"]] のように二重の角括弧で指定する
・存在しないラベルを含むリストを渡すと KeyError が発生するため、事前に in 演算子や query メソッドでの確認・対処が有効

これらのテクニックを活用すれば、大規模なデータセットからも目的のデータを効率的かつ正確に取り出せるようになります。

  1. 【Python】Pandas DataFrameからサブセット(列の一部)を選択する方法

    Pandas DataFrameのサブセット選択とは? Pandasでは、DataFrameから必要な列や行だけを取り出す操作を「サブセットの選択」と呼びます。大きなデータセットから目的のデータだけを抽出できれば、分析や前処理の効率が大幅に向上します。 この記事では、CSVファイルを読み込んだDataFrameから、1つの列、および複数の列を選択する基本的な方法を解説します。 使用するCSVファイルの内容 今回使用する「SalesData.csv」は、Microsoft Excelで開くと以下のような内容になっています。 CSVファイルからDataFrameを作成する まず、pd.rea

  2. Python・Pandasのquery()メソッドでデータを効率的にフィルタリングする方法

    Pandasは、データクレンジングやデータ分析などに幅広く利用されているPythonのライブラリです。本記事では、query()メソッドを使用して、指定したデータセットから条件に合致するデータを抽出する方法を解説します。query()メソッドでは、単一の条件だけでなく、複数の条件を組み合わせた絞り込みも可能です。データの読み込みまず、Pandasライブラリを使ってCSVファイルのデータをDataFrameとして読み込みます。以下のプログラムがその基本的なコードです。サンプルコードimport pandas as pd # CSVファイルからDataFrameを読み込む data = pd.r