Проблема apply()

Любой джун пишет df.apply(lambda x: ...) и не понимает почему датасет на 1М строк обрабатывается 5 минут.

# МЕДЛЕННО: 30 секунд на 1М строк
df['vat'] = df['amount'].apply(lambda x: x * 0.12)

# БЫСТРО: 50ms на 1М строк
df['vat'] = df['amount'] * 0.12

Разница: apply запускает Python-функцию для каждой строки. Векторизованные операции работают на C-уровне через NumPy.

Когда apply оправдан

  • Сложная функция без vectorized аналога
  • API-вызовы для каждой строки (хотя лучше batch)
df['city_name'] = df['city_code'].apply(lookup_city_via_api)

np.where для условной логики

df['size'] = np.where(df['amount'] > 100, 'big', 'small')

df['tier'] = np.select(
    [df['amount'] > 1000, df['amount'] > 100],
    ['premium', 'standard'],
    default='basic'
)

df.eval() для математики

df.eval('profit = revenue - cost - tax', inplace=True)

Бенчмарк

Метод1M строк
apply(lambda)28 сек
df * 0.120.05 сек
df.eval()0.03 сек

Кейс из Magnum

Аналитик считал маржу по 5М SKU через apply. ETL занимал 45 минут. Переписали на векторные операции — 8 секунд.