【Python】Pandasメモ:ilocとlocの違い、データの抽出方法

【Python】Pandasメモ:ilocとlocの違い、データの抽出方法

はじめに

コジマです。

ilocとlocの使い方についてまとめます。

ilocとlocの違い

簡単に言うと

iloc:行を番号で指定する
loc:行をindexで指定する

となります。

実際に見ていきながら解説することにします。

データを準備

名前、身長、体重を持つデータを用意しました。

import numpy as np
import pandas as pd

# 名前、身長、体重
df = pd.DataFrame([
    ["user1", 170, 60],
    ["user2", 180, 80],
    ["user3", 150, 43],
    ["user4", 175, 70],
    ["user5", 160, 71],
    ["user6", 172, 85]
    ],
    columns=["name","height", "weight"]
    )

print(df)
    name  height  weight
0  user1     170      60
1  user2     180      80
2  user3     150      43
3  user4     175      70
4  user5     160      71
5  user6     172      85

使い方

これだけで使えます。

df.iloc[行番号,列番号]
df.loc[行インデックス,列名]
※列は省略可能

ilocのサンプルソース

import numpy as np
import pandas as pd

# 名前、身長、体重
df = pd.DataFrame([
    ["user1", 170, 60],
    ["user2", 180, 80],
    ["user3", 150, 43],
    ["user4", 175, 70],
    ["user5", 160, 71],
    ["user6", 172, 85]
    ],
    columns=["name","height", "weight"]
    )

######iloc######
print("--------user3の行丸ごと--------")
print(df.iloc[2])

print("--------user4の身長--------")
print(df.iloc[3, 1])


print("--------user1〜user3の身長と体重--------")
print(df.iloc[:3, -2:])

このように行は上から何番目の行か、列は左から何番目の列か
という指定をするだけでデータを抽出してくることができます。
範囲をスライスで複数抽出することもできます。

出力結果

以下のように取得できます。

 
--------user3の行丸ごと--------
name      user3
height      150
weight       43
Name: 2, dtype: object
--------user4の身長--------
175
--------user1〜user3の身長と体重--------
   height  weight
0     170      60
1     180      80
2     150      43

locのサンプルソース

locにはインデックスが必要なので、set_indexメソッドを使用してインデックスを設定します。
その上で、ilocを同等の書き換えを行なっていきたいと思います。

import numpy as np
import pandas as pd

# 名前、身長、体重
df = pd.DataFrame([
    ["user1", 170, 60],
    ["user2", 180, 80],
    ["user3", 150, 43],
    ["user4", 175, 70],
    ["user5", 160, 71],
    ["user6", 172, 85]
    ],
    columns=["name","height", "weight"]
    )

# indexを設定
df2 = df.set_index("name")
print("--------df2全部--------")
print(df2)

######loc######
print("--------user3の行丸ごと--------")
print(df2.loc["user3"])

print("--------user4の身長--------")
print(df2.loc["user4", "height"])


print("--------user1〜user3の身長と体重--------")
print(df2.loc[:"user3", "height":])

出力結果

このように出力されます。
user3の行丸ごとのところだけ、インデックスになってる故に名前は出てきませんが、
実質同値となります。

インデックスを指定するとこのようにインデックスは一段下がって表示されます。

--------df2全部--------
       height  weight
name                 
user1     170      60
user2     180      80
user3     150      43
user4     175      70
user5     160      71
user6     172      85
--------user3の行丸ごと--------
height    150
weight     43
Name: user3, dtype: int64
--------user4の身長--------
175
--------user1〜user3の身長と体重--------
       height  weight
name                 
user1     170      60
user2     180      80
user3     150      43

使い分け

個人的な所感となってしまいますが、名前で抽出できるlocに軍配が上がりました。
実際使い分けるとしたら自分はこんなシチュエーションかなと思いました。

ilocを使うとき

  • データ全体が見渡せる程度のデータ量のとき
  • スライスで特定の範囲を抽出したい時

locを使うとき

  • 名前で抽出したいとき
  • ソースコードの可読性を求める時

さいごに

こちらのUdemyの講座を参考にしました。
ilocとlocの使い分けがあやふやだったのがこの動画で晴れました。
英語ですが、わかりやすいです。
The Complete Pandas Bootcamp: Master your Data in Python.

この記事を面白いまたは役に立ったと思ってくれた方は是非私のTwitter(@kojimanotech)を
フォローしてくれたらうれしいです!

以上、コジマでした。


Pythonカテゴリの最新記事