Python pandasの基礎⑩ ~データフレームにおけるlocとilocのデータ選択編~

記事内に広告が含まれています。

どうも!僕です!
つか〇です!

「NumPyみたいにインデックス参照しようとしたけど思ったようにいかんわ!」

「なんや全然うまいこと取り出せんわ!!パソコン投げたろか!!」

待ってください!まだ投げないで!!
これから紹介する「loc」と「iloc」を理解すれば,好きな要素を好きな方法で取り出せます!

つか〇自身がpandasすらわかってなかった超初心者だからこそ,わかりやすく説明していますのでパソコンを投げずに一緒に勉強していきましょう!

loc

まず,locについて,解説します.
locもilocもデータフレーム構造のデータからNumPyのように要素を取り出せることができるのが特徴です.

NumPyとデータフレーム構造両方を比較していきながら,見ていきましょう!

まず,NumPyについて,下記のように適当な配列を作って,そこから取り出したい要素を参照していきます.

import numpy as np

arr = np.arange(20).reshape(5,4)
arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19]])

では,この配列から「2と3行目の1と2列目」の要素を取り出してみましょう.
つまり,「9, 10, 13, 14」を取り出すということですね.
これは以下のようにします.

arr[2:4, 1:3]
array([[ 9, 10],
       [13, 14]])

このように書くか,

arr[[2, 2, 3, 3], [1, 2, 1, 2]]
array([ 9, 10, 13, 14])

このように書いたりします.
ここで,注意すべきは,出力された配列のサイズが異なることに注意してください。
ここでは深く解説しませんが,取り出したいサイズで行いましょう.

では,次にデータフレームでも同様に要素を取り出してみましょう.
まず,上記の配列と同様のサイズのデータフレーム構造のデータを作ります.

import pandas as pd
from pandas import DataFrame

df = pd.DataFrame(np.arange(20).reshape(5, 4),
                 index=["Shiga", "Kyoto", "Nara", "Hyogo", "Mie"],
                 columns=["a", "b", "c", "d"])
df
    a	b	c	d
Shiga	0	1	2	3
Kyoto	4	5	6	7
Nara	8	9	10	11
Hyogo	12	13	14	15
Mie	16	17	18	19

上記の例と同様に「9, 10, 13, 14」の要素をlocを用いて,取り出してみます.

df.loc[["Nara", "Hyogo"],["b", "c"]]
	b	c
Nara	9	10
Hyogo	13	14

見事「9, 10, 13, 14」が取り出せましたね!!

え,なんか違うって?

そうなんです.
データフレームはその構造上,インデックスに任意のラベル名の設定をします.
なので,データフレームでは,そのラベル名を指定することで,任意の要素を取り出すことができます.
そして!それを可能にしているのが,「loc」フィールドというものです.

これを使うことで,

「あれ?何行目やっけ?」

とか,

「あれ?何列目やっけ?」

っていう場合でも,

「この行名(列名)を取り出したい!!」

の名前を指定することで取り出すことができます!

これは,NumPyと同様にスライシングも使うことができます.
例えば,上の例で奈良までの「b」以降を取り出したいときは下記のようにします.

df.loc[:"Nara", "c":]
        c	d
Shiga	2	3
Kyoto	6	7
Nara	10	11

もうほぼNumPyですね!
NumPyの操作をラベル名に置き換えただけでできます.

頭の片隅に置いておきましょう!!

iloc

続いて,ilocについて紹介します.
ilocは,

「データフレームでもNumPyみたいにインデックス番号で指定したい~」

ってときに使います.

では,上記のデータフレームを使って,同じく「9, 10, 13, 14」を取り出してみましょう.

df.iloc[[2, 3], [1, 2]]

        b	c
Nara	9	10
Hyogo	13	14

NumPyのときと指示方法は異なりますが,インデックス番号で取り出すことができました.
NumPyでは,配列だったので,スライシングや一つ一つのインデックスが必要になりましたが,データフレームのilocでは,取り出したい行と列をそれぞれリスト([2,3]行と[1, 2]列)にして渡せば,このように任意の要素を取り出すことができます.

NumPyについての挙動は,「Python,NumPyの基礎⑤ ~ndarrayにおけるファンシーインデックス参照~」でファンシーインデックスについて述べてますので,参考にしてください.

データフレームとNumPyのndarrayでの操作の違いを明確にしておくと,後々操作が早くなりそうですね!
つか〇も頑張ります!!

では,locと同様にilocについてもスライシングを使ってみましょう.

df.iloc[:3, 2:]

        c	d
Shiga	2	3
Kyoto	6	7
Nara	10	11

locと同様の要素をインデックス番号でスライシングを使って取り出すことができました!!

これができれば,あなたはデータフレームマスターです!!
(気が早い...(笑))

まとめ

データフレームについての,要素の取り出しについて,ラベル名で取り出す「loc」とインデックス番号で取り出す「iloc」について見てきました.

これが扱えれば,膨大なデータでも中身が何か把握できそうですね.

今回の記事も「Pythonによるデータ分析入門」を基に作成しています.
実際のデータ分析に扱うライブラリについて触れており,Pythonの基礎も抑えているので,データ分析を始めてみたいという方におすすめです!

地道な努力が必要ですが,今努力している人はきっと明るい未来が待っています!
一緒に積み上げて,輝く未来を築いていきましょう!!

コメント

タイトルとURLをコピーしました