🐍 Почему apply() в pandas почти всегда можно заменить (и ускорить код)
Многие, кто начинает работать с pandas, пишут так:
import pandas as pd
df = pd.DataFrame({
"price": [100, 200, 300],
"quantity": [1, 2, 3]
})
# Хотим посчитать выручку
df["revenue"] = df.apply(
lambda row: row["price"] * row["quantity"], # берём строку
axis=1 # применяем к каждой строке
)
print(df)
Работает. Но это медленно и не по-питоновски для pandas.
В чём проблема?
apply(axis=1):
• проходит по строкам в Python-цикле
• ломает векторизацию
• сильно проигрывает по скорости на больших данных
По сути, вы возвращаете себе обычный цикл for.
Как правильно?
В pandas почти всегда нужно думать векторно:
# Векторное решение – без apply
df["revenue"] = df["price"] * df["quantity"]
print(df)
Что здесь происходит:
• операции выполняются на уровне массивов (NumPy)
• без Python-циклов
• значительно быстрее на больших объёмах
Когда разница становится критичной?
На 1 000 строк – почти незаметно.
На 1 000 000 строк – может отличаться в десятки раз.
Именно поэтому опытные аналитики стараются:
• избегать apply(axis=1)
• использовать встроенные операции
• мыслить колонками, а не строками
Когда apply() всё же оправдан?
• если логика действительно сложная
• если нельзя выразить её векторно
• если это прототип, а не продакшен
Но в 80% случаев apply() – это просто привычка.
Главное правило
Если в pandas вы пишете apply(axis=1) – сначала подумайте: можно ли это сделать через операции над колонками?
Чаще всего – можно.