Проблема 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.12 | 0.05 сек |
| df.eval() | 0.03 сек |
Кейс из Magnum
Аналитик считал маржу по 5М SKU через apply. ETL занимал 45 минут. Переписали на векторные операции — 8 секунд.