概要(loc/ilocは「行・列の取り出し方が違う」二大基本操作)
pandasのlocとilocは、DataFrameから行・列・セルを取り出すための代表的な方法です。locはラベル(行名・列名)で指定し、ilocは整数の位置(0始まり)で指定します。どちらも抽出・フィルタ・更新に使えますが、起点となる“指定の軸”が根本的に異なります。
基本の考え方(locはラベル、ilocは位置)
違いの一文まとめ
- locは「名前で選ぶ」操作です。行インデックスや列名をそのまま指定して抽出・更新します。
- ilocは「番号で選ぶ」操作です。行番号・列番号を0からの整数で指定して抽出・更新します。
最小例(同じ見た目でも中身が違う)
import pandas as pd
df = pd.DataFrame(
{"name": ["Taro", "Hanako", "Jiro"], "age": [20, 25, 30]},
index=["u1", "u2", "u3"] # 行ラベル
)
# ラベルで選ぶ(loc)
row_u2 = df.loc["u2"] # 行ラベル "u2"
col_name = df.loc[:, "name"] # 列名 "name"
# 位置で選ぶ(iloc)
row_1 = df.iloc[1] # 2番目の行
col_0 = df.iloc[:, 0] # 1番目の列
Pythonlocとilocは記法が似ていますが、指定する値がラベルか位置かで意味が変わります。
行・列選択の基礎(単一、複数、範囲、ブール条件)
単一・複数の選択
# 単一行・単一列
df.loc["u1", "age"] # ラベルで1セル
df.iloc[0, 1] # 位置で1セル
# 複数行・複数列
df.loc[["u1", "u3"], ["name", "age"]]
df.iloc[[0, 2], [0, 1]]
Pythonlocはラベル配列、ilocは位置配列で複数選択を表現します。
範囲(スライス)の違いを理解する
- locのラベルスライスは「終端を含む」ことがあるため、ラベル名の並びに依存します。
- ilocの整数スライスはPythonの標準スライスと同じ「終端を含まない」半開区間です。
# loc(ラベル範囲:終端を含みうる)
df.loc["u1":"u3", "name":"age"]
# iloc(整数範囲:終端を含まない)
df.iloc[0:3, 0:2]
Python「ラベルは終端含む/整数は終端含まない」の違いを覚えておくと、意図しない行・列の過不足を避けられます。
条件(ブール)で選ぶ
# 条件で行フィルタ(年齢 >= 25)
df.loc[df["age"] >= 25, :] # ラベル指定のフィルタ
df.iloc[(df["age"] >= 25).values, :] # 位置指定でも可能だが、通常はlocが読みやすい
Python条件抽出はlocと相性が良く、行条件+列指定を組み合わせて読みやすく書けます。
更新(代入)と安全な書き方(コピー/ビュー問題を避ける)
locで条件更新(定番)
# 25歳以上の人にタグ列を追加して付与
df["tag"] = ""
df.loc[df["age"] >= 25, "tag"] = "senior"
Python条件更新はlocで「行条件」と「列名」を明示し、代入します。読みやすく、誤更新を避けやすい書き方です。
ilocで位置更新(構造が固いとき)
# 2行目・2列目(age)を31にする
df.iloc[1, 1] = 31
Pythonインデックスや列名が不安定でも「物理位置を信頼したい」場面で有効です。
代入時の注意
- 代入は「抽出がビューかコピーか」で挙動が揺れます。loc/ilocで明示したスライスに直接代入する形を徹底すると安全です。
- チェーンインデックス(df[df[“age”]>20][“name”] = “x”)は避け、必ずlocで一発指定にします。
実践例(行選択、部分列、条件抽出、ラベル×位置の併用)
ラベルで人名を選ぶ→列で最小限の情報だけ取得
df_people = pd.DataFrame(
{"age": [22, 35, 28], "city": ["Tokyo", "Osaka", "Nagoya"]},
index=["Taro", "Hanako", "Jiro"]
)
out = df_people.loc[["Hanako", "Jiro"], ["age", "city"]]
Python「誰(行ラベル)」「何(列名)」を自然な言葉のように指定できます。
位置で高速にブロック抽出
# 先頭2行×先頭2列のブロック
block = df_people.iloc[0:2, 0:2]
Python構造がわかっているときは、位置指定でサクサク抜き出せます。
条件×列絞りの定番
# 30歳以上の人の都市だけ
cities = df_people.loc[df_people["age"] >= 30, "city"]
Python条件抽出+単一列選択はlocが読みやすく、後工程の集計・可視化につなぎやすいです。
つまずき対策(ラベル/位置の誤解、スライス終端、条件と代入)
ラベルと位置の取り違え
行ラベルが数字でも、locは「ラベル値」、ilocは「位置」です。数字ラベルのDataFrameでilocと混同しないように注意します。
スライスの終端を勘違いしない
locはラベルの終端を含み、ilocは含みません。borderがズレた原因はここにあることが多いです。
条件抽出はlocで一発指定
df[条件][“列”] = 値 のようなチェーン代入は避け、df.loc[条件, “列”] = 値 の形に統一します。意図しないコピーへ代入して失敗しがちなパターンを防げます。
まとめ(「loc=ラベル」「iloc=位置」。終端と条件・代入の型を身体に入れる)
locはラベルで、ilocは位置で選ぶ。スライスは「loc終端含む/iloc終端含まない」。条件抽出と部分更新はlocで一発指定が定番。数字ラベルのDataFrameでも“ラベルと位置”を取り違えない。この型を守れば、初心者でも迷いなく正確に抽出・更新でき、後工程の集計や可視化へスムーズに繋げられます。
