Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

Python Pandsのlocの使い方

【初心者向け】Pandasのiloc/locを使って特定の行/列を抽出・表示させる方法の解説

【初心者向け】Pandasのiloc/locを使って特定の行/列を抽出・表示させる方法の解説

今回はPandasで特定の行や列の情報だけを選んで抽出したい・表示したいときに使えるilocとlocの使い方の基本を解説します。データ分析でよく使われる機能ですので慣れておくと今後の学習などが捗ります。

今回使うデータ

今回は次のようなPandaのデータフレームの表を使って解説します。データサイエンスコンペティションKaggleのタイタニックのデータです。

PythonとPandasとタイタニックのデータ

なお、Dockerを使ってWindowsでもMacでもLinuxでも同じPython環境やデータ分析環境を作る方法をこちらの記事で解説しています。

Dockerは初歩的な使い方だけでもできるようになると本当に便利なのでぜひ試してみてください。

ilocの使い方の基本

ilocとは?

ilocとは、行または列のインデックス(Index)情報を基準として特定の行や列だけを抽出する機能です。

前提知識:Pythonのリストとインデックス

Pythonにおけるインデックスについては、リストオブジェクトを例にするのが理解しやすいでしょう。まずリストオブジェクトを1つ作ってみます。

new_list: list = ["Google", "Apple", "Microsoft"]

このリストにおいてインデックスとは、要素の順番を示す整数です。ここでは次のように順番と要素が対応しています。

インデックス
(標準では0から始まる)
要素
0Google
1Apple
2Microsoft

最初のインデックスは、標準では0から始まることに注意しましょう。

では実際にインデックスを指定してリストの各要素を確かめてみましょう。

new_list[0]
new_list[1]
new_list[2]

結果は、

>>> new_list[0]
'Google'
>>> new_list[1]
'Apple'
>>> new_list[2]
'Microsoft'

となります。Micorsoftは3番目の要素ですが、インデックス番号は2となるので注意しましょう、

基本的な使用方法

ilocは基本的に次のように使います。

データフレーム.iloc[①, ②]

この①と②は、

行のインデックス情報
列のインデックス情報

このような情報となります。

②の列のインデックス情報は省略が可能です。しかし、行のインデックス情報を省略して、

データフレーム.iloc[列のインデックス情報]

と書いても、頭の中で思い描いた「列のインデックス情報」の指定は実際には「行のインデックス情報」の指定として扱われます。なぜならば、最初に書いてあるインデックス情報はつねに「行のインデックス情報」となるように設計されているからです。

使用例1:行だけのインデックスを指定

PythonとPandasとタイタニックのデータ

上述のように今回はこのようなデータフレームを使います。このデータフレームオブジェクトの名前を今回は「train_df」としています。

ではこのデータフレームのうち、行インデックスの0番から4番までの5つのデータを抽出してみます。Pythonにおけるスライス表記([X:Y]という書き方)を使います。

train_df.iloc[0:5]

注意点は、次の2点です。

この結果は、

pandasのilocの使い方の解説

このようになります。

ちなみに同じ結果を実現するために、ilocを使わなくても次のようにheadメソッドを使うこともできます。

train_df.head(5)

使用例2:行と列について両方のインデックスを指定

では次の行と列の両方ともインデックスを指定してみましょう。

まずそもそも列のインデックスというものを把握しておきましょう。そのためにひとまずcolumnsを使い、データフレームの列のラベルを確認しておきましょう。

train_df.columns

これを実行すると、

Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')

続いて、

train_df.columns[0]

とすると、

'PassengerId'

となります。このように列のラベルもインデックス情報を持っていることがわかりました。

  • 列ラベル「PassengerId」→インデックス0番
  • 列ラベル「Survived」→インデックス1番
  • 列ラベル「Pclass」→インデックス2番

などのように対応します。

そこで次のようにすると、

train_df.iloc[0:5, 0:2]
pandas ilocの使い方の解説

行のインデックス0〜4番までと、列のラベルのインデックス0番である「PassengerId」と、インデックス1番である「Survived」もあわせて抽出することができます。

使用例3:負のインデックスも可能

このilocにおけるインデックスは整数を使って指定しますが、実はPythonの普通のリストと同じく負の整数も使えます。ただ少し癖がある結果となります。

たとえば、

train_df.iloc[-5:-3, 0:2]

これはインデックス番号が-5から-4(-3-1 = -4だから)の情報を抽出することとなります。

これの結果は、

pandas ilocの使い方の解説

このようになります。

これは行のインデックスが次のようになっているからです。

pandas ilocの使い方の解説

使用例4:関数も可能

実は、Series型またはDataFrame型を呼び出す関数で、変数が1つだけの関数を指定することもできます。よく使われるのがラムダ関数でしょう。

たとえば、行のインデックスについて、「9で割ったときの余りが8となるインデックス番号」だけ抽出したいときは次のようにします。

train_df.iloc[lambda x: x.index % 9 == 8]

結果はこうなります。

pandas ilocの使い方の解説

locの使い方の基本

locとは?

公式APIリファレンス:pandas.DataFrame.loc

locは、

  • 行や列につけられた「ラベル」
  • ブーリアン型を要素とする配列(boolean array)
  • ラベルのリストや配列
  • ラベルのスライスオブジェクト([“a” : “b”]などの表記)
  • 引数が1つだけの関数で、Series型やDataFrame型を呼び出すもの

などによって行や列を指定するものです。

ilocとの違いと注意点

ilocとの違いは、上述の通りilocは「インデックス(index)」情報を使って行や列を指定するものですが、locは「ラベル」を使って指定するものという点が本質的な違いとなるでしょうか。

ですが実は重要な違いがあと1つあります。それはスライス表記を使って範囲を指定した場合の動作が違うことです。この点については下記「使用例2:行と列の両方についてスライスで指定」で解説しています。

locの基本的な使用方法

ilocと同じく、locも基本的に次のように使います。

データフレーム.loc[①, ②]

この①と②は、

行のインデックス情報
列のインデックス情報

それではこれまでと同じく下の画像のデータフレームを使って具体的な使用例を見ていきましょう。

PythonとPandasとタイタニックのデータ

使用例1:整数で指定

train_df.loc[1]

上述のようにlocは「ラベル」情報を使うのが基本ですが、このように整数を使うこともできます。これは行についての指定となり、「1」というラベルがついた行の情報を抽出することになります。

なぜなら、locもilocも、

データフレーム.loc[①, ②]
行のインデックス情報
列のインデックス情報

という使い方は同じであり、

loc[1]

とすると、最初の情報として指定した整数「1」は自動的に「行についての情報」となるからです。

また整数「1」は「ラベルの名称」(文字列のように)解釈されます、インデックスの順番を示す番号としては扱われません。あくまで「1」という文字を使った行のラベルとして処理されます。

こうして実行結果は、次のようになります。

Pandas locの使い方

今回指定したラベルの情報はあくまで行についてだけで、列については何もしていないので、行「1」の情報がまとめて表示されます。

使用例2:行と列の両方についてスライスで指定

train_df.loc[0:2, "PassengerId":"Age"

このように行と列のそれぞれにスライス表記を使ってみました。結果は、

Python Pandsのlocの使い方

このようになります。

ここで重要なのはスライスを使った場合の範囲指定の内容です。

普通Pythonのスライスは、

# 普通はaからb-1までを意味する
a : b

こうすると、aから「b-1」までの範囲を指定したことになります。これはiloc[a:b]の場合でも同じです。

しかし上のlocの結果をみてもらうとわかるように、locの場合は、

# locの場合のスライスは、aからbまでを意味する
a : b

このように、aからbまでの範囲を指定したことになります。この点に注意が必要です。

使用例3:条件を使って指定

次のように条件を使った指定も可能です。

train_df.loc[(train_df["Age"] <= 20.0) & (train_df["Sex"] == "male")]

これはAgeが20歳以下でSexがmaleという条件を指定しています。

結果は、

Python Pandsのlocの使い方

となります。

使用例4:ラムダ関数を使う

上述のようにlocはラベル情報だけでなく、ブーリアン型の要素の配列(array)も使うことができます。そこで、ブーリアン型配列を返す関数も使うことができます。

たとえば、ブーリアン型の配列を返すラムダ関数を使ってみます。

train_df.loc[lambda x : x["SibSp"] == 1]

この仕組みを大雑把に説明すると、まず変数xには、データフレームtrain_dfが代入されます。そして列ラベルSibSPの値が1という条件を満たすかどうかで0または1のブーリアン型の配列が生成され、それをもとにlocが機能するという仕組みになっています。

結果は、

Python Pandsのlocの使い方

世界最大級のオンライン学習プラットホームUdemy(ユーデミー)では、Pythonやデータ分析の様々な講座が用意されています。大幅に割引されるセールもよく開催されています。

Udemyでお得なデータ分析・データサイエンス講座を探す
愛を分かち合いましょう