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メソッドについてでした。
最後までお読みいただき、ありがとうございました。