Функция apply() в pandas: применение функции и её цена

apply() применяет функцию к данным: Series.apply — к каждому значению, df.apply — к каждому столбцу (axis=0) или строке (axis=1). Это самый гибкий инструмент, но и самый медленный — он выполняет питоновскую функцию в цикле. Аналитик берёт apply там, где нет векторизованной альтернативы, и избегает его на больших данных.

Синтаксис

df.apply(func, axis=1) | df['col'].apply(func)

Примеры использования

Пример 1: Функция по строке (несколько колонок)

df['total'] = df.apply(lambda r: r['price'] * r['qty'], axis=1)

Результат:

   price  qty  total
0     10    2     20
1      5    4     20

Пример 2: То же, но векторизованно — быстрее в разы

df['total'] = df['price'] * df['qty']   # без apply

Результат:

(тот же результат, но без питоновского цикла)
Порешать Python-задачи в тренажёре →

Типичная ошибка

apply — почти всегда сигнал, что есть более быстрый способ. Для арифметики бери векторные операции (df['a'] * df['b']), для условий — np.where/np.select, для строк — .str.*, для маппинга — .map/.replace. apply(axis=1) особенно медленный, потому что создаёт Series на каждую строку. На собеседовании «перепиши этот apply без apply» — частое задание.

Где спрашивают на собеседовании

apply-vs-векторизация — популярный вопрос про производительность pandas. Ценят понимание, что apply гоняет питоновскую функцию построчно (медленно), а векторные операции считаются в C сразу над массивом. Умей заменить apply на векторную форму.

FAQ: частые вопросы про apply

Чем apply отличается от map?

map работает только на Series и применяет функцию/словарь к каждому значению. apply шире: на Series — как map, на DataFrame — к строкам или столбцам. Для простого маппинга значений map быстрее и понятнее.

Почему apply работает медленно?

apply выполняет питоновскую функцию в цикле (особенно axis=1 — по строкам), без векторизации. На больших данных это в десятки раз медленнее векторных операций и .str/.dt аксессоров.

Как заменить apply векторизацией?

Арифметику — прямыми операциями над колонками, условия — np.where/np.select, строки — .str.*, даты — .dt.*, маппинг — .map/.replace. apply оставляй только когда векторной альтернативы нет.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas: основы · NumPy векторизация

Другие функции pandas

groupby · merge · pivot_table · value_counts · drop_duplicates · fillna

Открыть Python-тренажёр (556 задач) →