Pandasの.iterrows()とは?使い方や活用シーン、注意点までわかりやすく解説

.iterrows() は、Pandas で DataFrame を操作する際によく使われるメソッドのひとつです。

この記事では .iterrows() の基本的な使い方から、活用シーン、注意点までなるべくわかりやすく解説します。

.iterrows() とは?

pandas.iterrows() は、DataFrameの各行を1行ずつ処理したいときに使える便利なメソッドです。

通常、pandas では「ベクトル化(まとめて処理)」が高速で効率的ですが、処理内容が行ごとに異なる場合や、外部システムと連携する場合などには .iterrows() が活躍します。

このメソッドを使うと、DataFrame の各行をループで1つずつ取り出して処理できます。

各ループでは (インデックス, 行データ(Series)) のタプルが返されます。

具体例①:基本的な使い方

まずは、簡単なサンプルデータを使って .iterrows() の動きを見てみましょう。

このコードでは:

  • df.iterrows() によって各行を取り出す
  • index はその行のインデックス番号
  • row は行全体を表す Series で、列名をキーにして値を取り出せる

出力は以下のようになります:

このように、各行に対して柔軟な処理が書けるのが .iterrows() の特徴です。

具体例②:条件に応じた処理に使う

.iterrows() は、行の内容に応じて何か特定の処理をしたいときに便利です。

このように:

  • 各行の 年齢 をチェックして
  • 条件に合う行だけ処理をする

フィルタや条件付き処理を柔軟に書ける点が強みです。

.iterrows() を使うときの注意点

便利な .iterrows() ですが、使う際にいくつか注意すべきポイントがあります。

処理が遅くなりがち

.iterrows() は Python のループとして実行されるため、データ量が多いと処理速度がかなり遅くなります。

特に数千〜数万行以上の DataFrame を扱う時は、vectorized(ベクトル化)処理apply() を検討した方がよいです。

行のデータ型は Series(dtypeが混在)

row の正体は pandas.Series なので、各列のデータ型(int, float, str など)が混在しています。

そのため、型変換が必要になるケースもあります。

行に対して代入するときは注意

.iterrows() を使って行の値を書き換えようとしても、DataFrame 本体には反映されません。

上記のように書き換えても、元の df は変わらないので注意しましょう。

値を変更したい場合は、インデックスを使って直接代入する必要があります。

このように df.at[] を使えば、正しく更新されます。

.iterrows() の活用シーン

処理内容が行ごとに異なる場合や、外部システムと連携する場合などに .iterrows() は活躍します。

  • ルールベースで行ごとに処理を行いたいとき(条件分岐など)
    • たとえば、列の値に応じて異なる処理をしたり、特定の条件に合う行だけを別の形に変換したいときに便利です。
  • 外部APIとやりとりして、1行ずつ情報を付加したいとき
    • APIリクエストは基本的に「1件ずつ送る」必要があるため、各行のデータを使って外部サービスから情報を取得し、DataFrameに追加するときに使われます。
  • データクレンジングなどで複雑な処理が必要なとき
    •  例えば、住所の正規化、文字列の分割・再結合、あるいは複数列の値を組み合わせた独自ルールの修正など、単純な数値演算では処理しづらいケースに適しています。

特に「行ごとの処理内容がバラバラ」「簡単なベクトル演算では対応しづらい」ようなケースでは .iterrows() が役立ちます。

まとめ

今回は Pandas の .iterrows() メソッドについて解説しました。

  • .iterrows() は DataFrame を「1行ずつ処理」したい時に便利なメソッド
  • 各行は (index, row) の形式で取り出され、row は Series として扱える
  • 条件付き処理やAPI連携など、柔軟な処理が必要なシーンに便利
  • ただし、大量データには向かず、パフォーマンスに注意
  • 値の書き換えには df.at[] などを使う必要あり

扱いに注意は必要ですが、正しく使えば非常に便利なメソッドです。

DataFrame に対して「1行ずつ丁寧に処理したい」場合は、ぜひ .iterrows() を活用してみましょう。

おすすめの記事