AIで楽して稼げたらいいのに

独学でプログラミングを学んでいる大学生です。忘れないために備忘録としてここに残すことにします

【Python】PandasのDataFrame.ilocとDataFrame.locの違いを解説




Pandasでデータを分割したり、ある行(もしくは列)だけ抽出して取得したいときに


DataFrame.iloc
DataFrame.loc


を用いることがあります。


似たような形をしているので、どちらがどういった処理を行うのか混同してしまうことがあると思います。


なので、今回はこの2つの違いについて解説したいと思います。


前提

import pandas as pd

columns = ["column_1", "column_2", "column_3", "column_4"]
index = ["row_1", "row_2", "row_3"]

df = pd.DataFrame([list("ABCD"), list("EFGH"), list("IJKL")], columns=columns, index=index)
df



f:id:gorilland_k:20200423200416p:plain

前提として、DataFrame型のデータを作成し、これを用いて解説を進めていきます。


DataFrame.iloc


DataFrame.ilocでは、数字のみ使用することが可能です。


df_iloc = df.iloc[1, 1]
  • 第1引数:行の番号
  • 第2引数:列の番号


    番号はリストと同じように0から始まります。
    f:id:gorilland_k:20200423221435p:plain

イメージとしては上図のようになります。


よって先程のコードを実行すると


df_iloc = df.iloc[1, 1]
>>> 'F'


となります。


このように、各行(または各列)に付けられた名前の有無に関わらず、番号として扱うことができます。


逆に、行と列の名前を指定して取り出そうとしてみます。


df_iloc = df.iloc[row_2, colimn_2]
>>> ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
     :
ValueError: Location based indexing can only have [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array] types



整数、整数のスライス、ブールarrayでないといけないと書いています。


とにかく、文字列を含んだ引数を入れてはいけない!ということです。


DataFrame.loc


DataFrame.locは.ilocとは逆で、名前に直接アクセスしないとTypeErrorが出てしまいます。


df_loc = df.loc["row_2", "column_2"]


このように元からあったもしくは、自分で設定した名前を指定する必要があります。


出力結果は以下の通りになります。

>>> 'F'



お気づきかもしれませんが、先ほどの実行結果と同じになっています。


df.iloc[1, 1]
df.loc["row_2", "column_2"]


まとめ


役割としては、.locも.ilocも同じですが、


データの対しての扱い方が違います。


例えば、"価格"という列の情報だけが欲しい時にはDataFrame.locを使うべきです。


それ以外に、列(または行)の特徴は特に考慮せず2番から7番まで欲しい。という場合には、DataFrame.ilocが適しています。


それぞれの場面に対して使い分けることが大切です。