AI資格ドリル
資格を選ぶ

用語比較

locとilocの違い|ラベルで選ぶか、位置で選ぶか(Python3データ分析)

locとilocの違いは行や列を何で指定するかで、locはラベル、ilocは0から数える整数の位置で選びます。どちらもpandasのSeriesやDataFrameの属性です。

スライスの終点も違い、locのラベルのスライスは開始も終了も含むので、同じ「1:3」でもlocとilocで取り出される行数が変わります。

この記事の根拠と出典

各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。

locとilocの要点

loc

主にラベルで選ぶ。ラベルのスライス 'a':'f' は、開始も終了も含まれる。ラベルが見つからないとKeyErrorになる。

iloc

主に整数の位置(0から、軸の長さ-1まで)で選ぶ。スライスは通常のPythonと同じで、終端を含まない。範囲外の指定はIndexErrorになる(スライスは範囲外でもエラーにならない)。

違いを表で確認

比較軸lociloc
何で指定するかラベル(行索引・列名)整数の位置(0から数える)
スライスの終点含まれる(開始も終了も、索引にあれば含まれる)含まれない(通常のPythonのスライスと同じ)
整数を渡したとき整数もラベルとして扱う。位置ではない整数は位置として扱う
存在しない指定をしたときラベルが見つからないとKeyErrorになる範囲外の位置を指定するとIndexErrorになる(スライスは範囲外でも許される)
真偽値の配列渡せる渡せる
1つの値だけを速く取り出す場合の対応at[行ラベル, 列ラベル]iat[行の位置, 列の位置]

Python3エンジニア認定データ分析試験の学習に使う書籍(Amazon)

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

df.loc[0:2] と df.iloc[0:2] の行数が違って戸惑っている人

locはラベルの0から2までを終点も含めて選ぶので3行、ilocは位置の0と1だけを選ぶので2行です。既定の索引(0から始まる連番)でも、この差は出ます。

02

索引が連番でないのに、整数を渡して KeyError が出た人

locは整数もラベルとして扱います。索引が10、20、30のようにずれているとき、loc[1]はラベル1を探すので、見つからなければKeyErrorです。位置で選びたいならilocを使います。

03

出力を読む問題で、どの行が選ばれたのか追えない人

まず、メソッドがlocかilocかを見ます。次に、渡した値がラベルか位置かを決め、スライスなら終点を含めるかどうかを確かめます。この順に見れば、選ばれる行を1行ずつ書き出せます。

具体例で使い分ける

例 1

索引が10、20、30、40、50のSeriesで、locとilocを比べる

s = pd.Series(list("abcde"), index=[10, 20, 30, 40, 50]) とします。値はa、b、c、d、eで、ラベルは10から50、位置は0から4です。この Series に対して、s.loc[20:40]、s.iloc[1:3]、s.loc[1]、s.iloc[1] を実行したときの結果を追います。

  • s.loc[20:40] は、ラベル20から40までのスライスです。開始も終了も含まれるので、ラベル20・30・40の3行(b、c、d)が選ばれます。
  • s.iloc[1:3] は、位置1から3の手前までのスライスです。終端は含まれないので、位置1と2の2行(b、c)が選ばれます。
  • s.loc[1] は、ラベル1を探します。この索引に1はないため、KeyErrorになります。1は位置ではなくラベルとして扱われる点が要点です。
  • s.iloc[1] は、位置1の値を取り出します。結果は b です。

結論: 同じ「1」や「1:3」でも、locはラベル、ilocは位置として読みます。さらに、スライスはlocなら終点を含み、ilocなら含みません。この2点を順に確かめれば、結果を書き出せます。

例 2

公式ドキュメントの DataFrame の例で、行と列を選ぶ

pandas公式の「10 minutes to pandas」には、df.loc[:, ["A", "B"]] と df.iloc[3:5, 0:2] の例があります。どちらも、行と列の2つの指定をカンマで区切って渡す形です。

  • df.loc[:, ["A", "B"]] は、行は「:」ですべて、列は列名AとBを指定しています。全行のうち、A列とB列が選ばれます。
  • df.iloc[3:5, 0:2] は、行を位置3から5の手前まで、列を位置0から2の手前までで指定しています。行は位置3と4、列は位置0と1が選ばれます。
  • 公式は、df.loc["20130102":"20130104", ["A", "B"]] の例でも、ラベルのスライスでは両端が含まれると述べています。

結論: 行と列を同時に選ぶときも、locは行ラベルと列名、ilocは行の位置と列の位置を渡します。ラベルと位置を1つの指定の中で混ぜないのが基本です。

問題文から答えを選ぶ手順

  1. 1

    locかilocかを見る

    メソッド名で、渡した値をラベルとして読むか、位置として読むかが決まります。

  2. 2

    渡された値がスライスかどうかを見る

    スライスなら、locは終点を含み、ilocは含みません。単一の値や配列なら、ラベルまたは位置で1つずつ選びます。

  3. 3

    存在しない指定がないかを確かめる

    locでラベルが見つからなければKeyError、ilocで位置が範囲外ならIndexErrorです。

試験での見分け方

  • 1.loc は主にラベルで選ぶ。ラベルのスライスは開始も終了も含まれる。
  • 2.iloc は主に整数の位置で選ぶ。スライスは通常のPythonと同じで、終端を含まない。
  • 3locでは整数もラベルとして扱う。位置で選びたいときはilocを使う。

誤答しやすい選択肢

locのスライスも、終点を含まないと考える

修正: ラベルのスライスでは、索引にあれば開始も終了も含まれます。含まれないのはilocのスライスです。

locに渡した整数を、位置だと考える

修正: locは整数もラベルとして扱います。索引が連番でないときは、位置を指定したつもりでもKeyErrorになります。

どちらも存在しない指定では同じエラーになると考える

修正: locはラベルが見つからないとKeyError、ilocは範囲外の位置を指定するとIndexErrorです。ただしilocのスライスは範囲外でもエラーになりません。

確認問題

Q1DataFrameから、位置で行や列を選ぶときに使う属性は?

答え: iloc

ilocは主に整数の位置(0から、軸の長さ-1まで)で選びます。ラベルで選ぶのはlocです。

Q2既定の索引(0から始まる連番)のDataFrameで、df.loc[0:2] が選ぶ行数は?

答え: 3行

locのラベルのスライスは、開始も終了も含まれます。ラベル0、1、2の3行です。df.iloc[0:2] なら、位置0と1の2行になります。

Q3索引にラベル1がないSeriesに対して、s.loc[1] を実行すると、どうなるか?

答え: KeyErrorになる

locは整数もラベルとして扱い、ラベルが見つからないとKeyErrorを出します。位置1を取りたいときは s.iloc[1] です。

到達チェック

  • locとilocの、選び方の違い(ラベルか位置か)を言い分けられる
  • スライスの終点を含むのはlocだと説明できる
  • df.iloc[3:5, 0:2] が選ぶ行と列の位置を書き出せる

同じ資格で次に知りたいこと

よくある質問

Qlocとは?

A

pandasのSeriesやDataFrameから、主にラベルで行や列を選ぶ属性です。ラベルのスライスでは開始も終了も含まれ、ラベルが見つからないとKeyErrorになります。

Qilocとは?

A

主に整数の位置(0から、軸の長さ-1まで)で行や列を選ぶ属性です。スライスは通常のPythonと同じで、終端を含みません。

Qlocとilocの違いは?

A

選び方とスライスの終点です。locはラベルで選び、スライスは終点も含みます。ilocは位置で選び、スライスは終端を含みません。

Qlocとilocは、どちらも真偽値の配列を渡せますか?

A

渡せます。pandas公式ドキュメントは、locもilocも、主な入力に加えて真偽値の配列を使えると説明しています。

Qデータ分析試験の範囲?

A

本サイトの第4章pandasで、行・列の選択を扱います。出題の形式や範囲は、受験前に公式の案内で確認してください。

次に見る比較

執筆: AI資格ドリル編集部(運営者情報を見る)