Pythonの Pandas における .loc
と .iloc
の違いについて、詳しく体系的に解説します。
両者は「データフレームの行や列を抽出するためのインデクサ」ですが、使い方と挙動に明確な違いがあります。
目次
基本的な違い
.loc
→ ラベルベース(インデックスや列名で指定)
行や列を「名前」で選択する。.iloc
→ 整数位置ベース(行番号や列番号で指定)
行や列を「番号」で選択する。
具体例
まず、例となるデータフレームを作ります。
import pandas as pd
df = pd.DataFrame({
"A": [10, 20, 30, 40],
"B": [50, 60, 70, 80],
"C": [90, 100, 110, 120]
}, index=["row1", "row2", "row3", "row4"])
print(df)
.loc
の例(ラベル指定)
# 行ラベル指定
df.loc["row2"] # row2 のデータ
df.loc[["row1","row3"]] # 複数行
# 行と列の両方
df.loc["row2", "B"] # 値 60
df.loc[["row2","row3"], ["A","C"]] # 行と列の組み合わせ
# 範囲指定(ラベルは inclusive)
df.loc["row1":"row3"] # row1, row2, row3 が含まれる
.iloc
の例(番号指定)
# 行番号指定
df.iloc[1] # 2行目 (row2)
df.iloc[[0,2]] # 1行目と3行目
# 行と列の両方
df.iloc[1, 1] # 2行目×2列目 → 値 60
df.iloc[1:3, 0:2] # 行2〜3, 列1〜2(範囲は Python のスライス仕様で末尾は含まれない)
# 範囲指定(番号は exclusive)
df.iloc[0:2] # row1, row2 が含まれる
.loc
と .iloc
の挙動の違いまとめ
特徴 | .loc | .iloc |
---|---|---|
指定方法 | 行・列のラベル(名前) | 行・列の整数位置 |
範囲スライス | 末尾含む | 末尾含まない |
ブール条件 | 使用可能 | 使用不可 |
エラー挙動 | 存在しないラベルを指定するとエラー | 存在しない番号を指定するとエラー |
よくある間違いと注意点
- 範囲指定の違い
df.loc["row1":"row3"]
→ row3 を含むdf.iloc[0:3]
→ 3番目の行は含まれない
- 混同しやすいケース
インデックスが整数のとき(例: 0,1,2,3…)df.loc[1]
は「ラベル 1 の行」を探すdf.iloc[1]
は「2行目(0始まり)」を探す
→ データフレームのインデックスに「整数」を使っているとバグを生みやすい
- 条件抽出は loc
df.loc[df["A"] > 20] # OK df.iloc[df["A"] > 20] # エラー
使い分けの指針
- 列名・行名で抽出したいとき →
.loc
- 番号で抽出したいとき →
.iloc
- 範囲指定するときは inclusive/exclusive の違いに注意。
- 条件抽出は
.loc
を使う。
まとめ
.loc
→ 「ラベル(名前)で選ぶ」。範囲指定は末尾を含む。条件指定に対応。.iloc
→ 「整数番号で選ぶ」。範囲指定は末尾を含まない。条件指定不可。
以上、PythonのPandasのlocとilocの違いについてでした。
最後までお読みいただき、ありがとうございました。