【Pandas】loc,iloc の解説(スクショ付き) ・DataFrame["コラム名"]との違い　no.18

![見出しを追加 (43).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/73d80a11-028d-1ce7-38fe-bdd7eae2db3a.png)
こんにちは、まゆみです。

Pandasの記事をシリーズで書いています
今回は第18回目になります。

今回の記事では、Pandasの

>.loc[]

>.iloc[]

を詳しく解説していきます。(イラストを多用していますので初心者にも理解しやすいと思います)

前回までの記事では

DataFrame["コラム名"]を主に使い

あなたの抽出したいコラム名を取り出していました。

DataFrame["コラム名"]では、下記のイラストのように<font color="Red">縦の列を基準にデータを抽出</font>します(Ageと名のついたコラム1列が指定され、抽出したいなど)
![Age.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/d9db6a6c-abff-4eeb-a195-3fea4b2559aa.png)

.loc[] .iloc[]　は、まず横のインデックスを基準に使い、データを抽出します(2番目の引数に、コラム名を書くと、指定しているインデックスとコラムが交差するデータも取り出すことができますが、それについては後述します)
![Age (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/05dae4f5-88d7-d342-7780-85927e76ce90.png)
例えば、Takeshi と名前の付いたインデックスを取り出したいなどに便利です。

この記事を読めば

<ul>
<li>.loc[] .iloc[]の違い</li>
<li>.loc[] .iloc[]のスライスとPythonのスライスとの違い</li>
</ul>

が分かります

ではさっそく始めていきますね。

#今回使うデータ

今回は、『[National Football League の選手のデータ](https://gist.github.com/craigmbooth/5a9be04fe72d77fa3cff)』を使っていこうと思います

read_csv()で読み込むと下のようになります。

デフォルトのインデックスは数字になっています。

![スクリーンショット 2021-03-23 102850.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e47229ad-4caa-8eaf-19b5-a2324383bc46.jpeg)
選手の名前を使ってデータを取り出したいので、デフォルトで数字になっているインデックスを

 <font color="Red">選手の名前(full_name コラム)をインデックス</font>にします。

#DataFrameの特定のコラムをインデックスにする

![スクリーンショット 2021-03-23 103553.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/993e3be1-50b8-e4da-9ddc-6c17bef8dce9.jpeg)
引用元：[Pandasドキュメント](https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html)

>read_csv()メソッドの

>パラメーター　index_col=の引数を、インデックスにしたいコラム名

にします。
実行結果は下のようになります
![スクリーンショット 2021-03-23 104436.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/fcb1e8e0-23c5-99d4-249b-baf711b7d353.jpeg)

##あるコラムをインデックスにする方法、その2
コラムをインデックスにする方法は、もう一つあります

```
df.set_index("コラム名")
```

またset_index()メソッドの <font color="Red">inplace = というパラメーターの引数をTrueに変える</font>と、元々のデータが実行した結果に上書きされます。
※inplace の詳しい説明は[こちらから](https://qiita.com/Mayumi_Pythonista/items/788af7b3f8bd2658f6f2#inplace-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)どうぞ。

![スクリーンショット 2021-03-23 110010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/9a7b0ac8-fb8a-7af8-d594-880c90926c89.jpeg)
.set_index()でも、full_name のコラムをインデックスにできました。


>read_csv()のパラメーターindex_colにコラム名を引数に取るか

>.set_index()を使って、特定のコラムをインデックスにするか

した後、
.sort_index()でインデックスをアルファベット順に並べました。
![スクリーンショット 2021-03-23 111150.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/3b77767d-38c3-63ac-d077-5c6f237eafdc.jpeg)
では選手名をアルファベット順に並べ替えたこのDataFrameのインデックスを使って、いろんなデータの抽出法を書いていきます

#.loc[]
インデックスにあるAbraham, Johnという名前の選手のデータを出してみます

![スクリーンショット 2021-03-23 112054.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/2f2d906d-2152-6998-f9ce-964f781c9917.jpeg)
row に並んでいる当該選手のデータが取れました。

##Pythonのスライスも使える
.loc[]はPythonのスライスも使えます。

python のスライスの復習もさらっと書いておきますね
![見出しを追加 (45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/09541c6f-7c43-9136-051c-a90562df08e8.png)


>[start: stop: step]

> start にはどこから始めるのか
> stopは終わりはどこか
>step はいくつ飛ばしで取り出すか　を書く

ことになります

 <font color="Red">Pythonでスライスを使うと、stopの数字は含まない</font>ということに注意が必要です。

ややこしいですね。

ただ、パンをスライスするときを想像してみてください。(上のイラスト参考)

パンの一枚一枚は、リストの中のアイテムです。

その時[ 2: 5]とスライスしたいとすると、
<font color="Red">上記のイラストのピンクの数字で書かれた2と5にナイフを入れる</font>ことになります。

なので、取り出せるアイテムは

2, 3, 4 になります

Pythonのスライスの基本はこのように、 <font color="Red">stopの数字は含まない</font>です。

##.loc[]のスライス　Pythonのスライスとの違い

ではさっそく.loc[]でスライスを使ってみましょう

```
.loc[ "スタートのコラム名" : "ストップのコラム名" ]
```

![スクリーンショット 2021-03-23 115338.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/8a242f30-1c0e-83e8-8627-ac513a664c60.jpeg)

Pandas の.loc[]では、<font color="Red">Pythonのスライスとは違い、stopの値も含まれます。</font>

そこが相違点になりますので、注意が必要です。

ただ、他の点はPython のスライスも、Pandas .loc[]のスライスも同じになります

例えば、[ start: stop: 2]　として、一つ飛ばしで表示させます
![スクリーンショット 2021-03-23 115925.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/de6ea3b3-af0e-3b79-0d66-3b20845d6e9c.jpeg)

>[ :stop] と書けば、一番最初からstopまでの範囲だし

>[start: ] と書けば、指定したstart から最後までの範囲

を指定する事ができます

stopの値が含まれるのが違うだけで、あとの操作方法はPythonのスライスと同じです。


## 2つ以上のインデックスを指定するときはリスト型

では同様に、2人の選手のデータを取ってみましょう

その時引数は、リスト型にします

実行結果は以下のようになりました。
![スクリーンショット 2021-03-23 120538.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/94d46244-a7f1-7415-c07a-5b5eeae6f4d8.jpeg)

##インデックスの指定範囲とコラムの指定範囲を組み合わせる
![名称未設定のデザイン (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/751cf40e-03f8-d599-4ce4-e7c35b8fbf75.png)

インデックスの範囲を3番目のインデックスから6番目のインデックス、コラムの範囲を3番目から4番目で組み合わせて、上のイラストのような範囲を取り出すこともできます

.loc[ インデックスの範囲、コラムの範囲 ]

で範囲を指定できます。

![スクリーンショット 2021-03-23 180004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/7b883d51-0b5e-328d-b285-78ebe2bbf97f.jpeg)

#.iloc[]
では、もしインデックス名で指定をするのではなく、

<font color="Red">2番目のインデックスにあるrow</font>

とか

<font color="Red">3番目から6番目のインデックスにあるrow</font>

と、文字列ではなく、数字で指定したい場合の時を考えてみます。

その時に使えるのが

.iloc[] になります。

文字列か数列かの違いで、loc[] を使うか　iloc[]を使うかという決まってくるということになりますが、使用方法は基本的に同じです


ただ、一つ気を付けないといけないのが、

iloc[ start : stop ]

と範囲を指定した時に、<font color="Red">ilocの場合は stop の数字は含まない</font>と、Pythonで使うスライスと同じになります

#まとめ

今回の記事はこれくらいで終わりにします

また引き続きPandasの記事を書いていきますので、よろしくお願いします