Короткий ответ
iterrows создаёт отдельный объект Series для каждой строки и выполняет цикл в интерпретируемом Python-коде, что намного медленнее векторизованных операций; альтернативы — векторизация, np.where/np.select, itertuples (быстрее iterrows, если нужен именно построчный доступ), или groupby/transform для групповой логики.
Как это работает подробнее
iterrows конвертирует каждую строку в Series с приведением типов столбцов к общему dtype, что создаёт накладные расходы на каждой итерации; itertuples возвращает легковесные именованные кортежи и работает быстрее, но всё ещё медленнее, чем полностью векторизованный подход, выполняемый без явного Python-цикла по строкам.
Пример кода
Пример на Python
import pandas as pd
import numpy as np
df = pd.DataFrame({'amount': [100, -50, 200, 0]})
df['flag_loop'] = [1 if row['amount'] > 0 else 0 for _, row in df.iterrows()]
df['flag_vec'] = np.where(df['amount'] > 0, 1, 0)
print(df['flag_loop'].equals(df['flag_vec']))Что использовать на практике
- На практике. перед использованием iterrows стоит спросить, можно ли выразить ту же логику через векторизованные операции или np.select для многоусловной логики; если построчный проход действительно необходим (например, сложная stateful-логика, зависящая от предыдущих строк), стоит оценить объём данных и решить, оправдан ли iterrows для конкретного масштаба задачи.
- Проверка. оба способа должны дать идентичный результат (equals вернёт True), при этом замер времени на большом DataFrame покажет кратную разницу в скорости в пользу np.where.
Подводные камни
- Частые ошибки. используют iterrows по привычке для простых условных преобразований столбца, где достаточно np.where или apply по столбцу; не замеряют время выполнения на реальном объёме данных перед оптимизацией, выбирая "интуитивно более быстрый" метод без проверки.