PythonのPandasのiterrowsメソッドについて

Python,イメージ

AI実装検定のご案内

PythonのPandasにおける iterrows() メソッド について、基礎から応用まで詳しく解説します。

目次

iterrows() とは?

iterrows()DataFrame の各行を反復処理(イテレーション)するメソッド です。

各反復で、(行インデックス, 行データのSeries) のタプルを返します。

import pandas as pd

df = pd.DataFrame({
    "name": ["Alice", "Bob", "Charlie"],
    "age": [25, 30, 35]
})

for index, row in df.iterrows():
    print(index, row["name"], row["age"])

戻り値の詳細

  • index → DataFrameの行インデックス
  • row (pd.Series) → 行データを表すSeries
    • インデックスは 列名
    • 値はその行のデータ

特徴と注意点

メリット

  • Pythonicな書き方で1行ずつ処理できる
  • 行をSeriesとして扱えるので、row["列名"] で値を取り出しやすい
  • 簡単なループ処理やデバッグに便利

デメリット

  • 処理が遅い(ベクトル演算より桁違いに遅い)
    • iterrows() は1行ごとに pd.Series を生成するためオーバーヘッドが大きい
  • データ型が保持されないことがある
    • 数値列が float64 にキャストされることがある

よくある使い方

行ごとの条件処理

for _, row in df.iterrows():
    if row["age"] > 28:
        print(row["name"])

新しい列を追加

for index, row in df.iterrows():
    df.at[index, "age_category"] = "adult" if row["age"] >= 30 else "young"

print(df)

iterrows() の代替方法

処理速度が重要な場合は、以下の方法が推奨されます。

itertuples()

  • 各行を namedtuple で返す
  • iterrows() より高速
  • 列名は属性アクセス(例: row.age
for row in df.itertuples():
    print(row.Index, row.name, row.age)

ベクトル化処理

  • 可能であれば「ループせずに列全体を処理」したほうが圧倒的に高速
df["age_category"] = df["age"].apply(lambda x: "adult" if x >= 30 else "young")
print(df)

apply()

  • 行ごとに処理したい場合は axis=1 を指定
  • iterrows() より高速だが、ベクトル化には劣る
df["age_category"] = df.apply(
    lambda row: "adult" if row["age"] >= 30 else "young",
    axis=1
)
print(df)

使い分けの目安

  • デバッグや簡単な処理 → iterrows()
  • スピードが必要 → itertuples()
  • 大規模データ処理 → ベクトル化 or apply()

まとめ

  • iterrows()(index, Series) を返し、直感的に行データへアクセス可能
  • ただし「遅い」「型が崩れる」ため、大規模処理には不向き
  • 本格的な処理では itertuples() やベクトル化 を優先

以上、PythonのPandasのiterrowsメソッドについてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次