2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

見出しを追加 (43).png
こんにちは、まゆみです。

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

今回の記事では、Pandasの

.loc[]

.iloc[]

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

前回までの記事では

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

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

DataFrame["コラム名"]では、下記のイラストのように縦の列を基準にデータを抽出します(Ageと名のついたコラム1列が指定され、抽出したいなど)
Age.png

.loc[] .iloc[] は、まず横のインデックスを基準に使い、データを抽出します(2番目の引数に、コラム名を書くと、指定しているインデックスとコラムが交差するデータも取り出すことができますが、それについては後述します)
Age (1).png
例えば、Takeshi と名前の付いたインデックスを取り出したいなどに便利です。

この記事を読めば

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

が分かります

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

今回使うデータ

今回は、『National Football League の選手のデータ』を使っていこうと思います

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

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

スクリーンショット 2021-03-23 102850.jpg
選手の名前を使ってデータを取り出したいので、デフォルトで数字になっているインデックスを

選手の名前(full_name コラム)をインデックスにします。

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

スクリーンショット 2021-03-23 103553.jpg
引用元:Pandasドキュメント

read_csv()メソッドの

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

にします。
実行結果は下のようになります
スクリーンショット 2021-03-23 104436.jpg

あるコラムをインデックスにする方法、その2

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

df.set_index("コラム名")

またset_index()メソッドの inplace = というパラメーターの引数をTrueに変えると、元々のデータが実行した結果に上書きされます。
※inplace の詳しい説明はこちらからどうぞ。

スクリーンショット 2021-03-23 110010.jpg
.set_index()でも、full_name のコラムをインデックスにできました。

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

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

した後、
.sort_index()でインデックスをアルファベット順に並べました。
スクリーンショット 2021-03-23 111150.jpg
では選手名をアルファベット順に並べ替えたこのDataFrameのインデックスを使って、いろんなデータの抽出法を書いていきます

.loc[]

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

スクリーンショット 2021-03-23 112054.jpg
row に並んでいる当該選手のデータが取れました。

Pythonのスライスも使える

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

python のスライスの復習もさらっと書いておきますね
見出しを追加 (45).png

[start: stop: step]

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

ことになります

Pythonでスライスを使うと、stopの数字は含まないということに注意が必要です。

ややこしいですね。

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

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

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

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

2, 3, 4 になります

Pythonのスライスの基本はこのように、 stopの数字は含まないです。

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

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

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

スクリーンショット 2021-03-23 115338.jpg

Pandas の.loc[]では、Pythonのスライスとは違い、stopの値も含まれます。

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

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

例えば、[ start: stop: 2] として、一つ飛ばしで表示させます
スクリーンショット 2021-03-23 115925.jpg

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

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

を指定する事ができます

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

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

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

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

実行結果は以下のようになりました。
スクリーンショット 2021-03-23 120538.jpg

インデックスの指定範囲とコラムの指定範囲を組み合わせる

名称未設定のデザイン (6).png

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

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

で範囲を指定できます。

スクリーンショット 2021-03-23 180004.jpg

.iloc[]

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

2番目のインデックスにあるrow

とか

3番目から6番目のインデックスにあるrow

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

その時に使えるのが

.iloc[] になります。

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

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

iloc[ start : stop ]

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

まとめ

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

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

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?