はじめに
コジマです。
ilocとlocの使い方についてまとめます。
ilocとlocの違い
簡単に言うと
loc:行をindexで指定する
となります。
実際に見ていきながら解説することにします。
データを準備
名前、身長、体重を持つデータを用意しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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) |
1 2 3 4 5 6 7 |
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.loc[行インデックス,列名]
※列は省略可能
ilocのサンプルソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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:]) |
このように行は上から何番目の行か、列は左から何番目の列か
という指定をするだけでデータを抽出してくることができます。
範囲をスライスで複数抽出することもできます。
出力結果
以下のように取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 |
--------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を同等の書き換えを行なっていきたいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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の行丸ごとのところだけ、インデックスになってる故に名前は出てきませんが、
実質同値となります。
インデックスを指定するとこのようにインデックスは一段下がって表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
--------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に軍配が上がりました。
実際使い分けるとしたら自分はこんなシチュエーションかなと思いました。
- データ全体が見渡せる程度のデータ量のとき
- スライスで特定の範囲を抽出したい時
locを使うとき
- 名前で抽出したいとき
- ソースコードの可読性を求める時
さいごに
こちらのUdemyの講座を参考にしました。
ilocとlocの使い分けがあやふやだったのがこの動画で晴れました。
英語ですが、わかりやすいです。
The Complete Pandas Bootcamp: Master your Data in Python.
この記事を面白いまたは役に立ったと思ってくれた方は是非私のTwitter(@kojimanotech)を
フォローしてくれたらうれしいです!
以上、コジマでした。