Python | データ処理:loc / iloc

Python
スポンサーリンク

概要(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番目の列
Python

locとilocは記法が似ていますが、指定する値がラベルか位置かで意味が変わります。


行・列選択の基礎(単一、複数、範囲、ブール条件)

単一・複数の選択

# 単一行・単一列
df.loc["u1", "age"]     # ラベルで1セル
df.iloc[0, 1]           # 位置で1セル

# 複数行・複数列
df.loc[["u1", "u3"], ["name", "age"]]
df.iloc[[0, 2], [0, 1]]
Python

locはラベル配列、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でも“ラベルと位置”を取り違えない。この型を守れば、初心者でも迷いなく正確に抽出・更新でき、後工程の集計や可視化へスムーズに繋げられます。

タイトルとURLをコピーしました