apply, transform и map в pandas: когда что

0 задач Pyodide в браузере С эталонными решениями 2026 — с реальных собесов
Три метода, которые путают чаще всего на собесе аналитика — apply, transform и map. Разница простая, но её редко проговаривают вслух: map работает только с Series и меняет значения по словарю или функции поэлементно; apply гоняет функцию по строкам/столбцам DataFrame или по группам и может вернуть что угодно — скаляр, Series, целый фрейм; transform обязан вернуть объект того же размера, что и вход, поэтому идеален для «добавь колонку со средним по группе» без потери строк. Классический вопрос Ozon и Яндекса: посчитай долю каждого заказа в выручке клиента — тут нужен именно df.groupby('client')['amount'].transform('sum'), а не agg, иначе фрейм схлопнется. Ещё спросят про applymap (устаревший, с 2.1.0 — DataFrame.map) и почему apply по строкам с axis=1 медленный на больших данных. Здесь задачи ровно на эти развилки — с датасетами, которые крутятся в браузере через Pyodide.
Начать решать задачи →

Все задачи на «pandas-apply-transform» (0)

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

apply, transform или map — в чём разница?

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

Когда transform, а когда agg в groupby?

agg сворачивает группу в одно значение — df.groupby('cat')['x'].agg('sum') даёт одну строку на категорию. transform возвращает значение для каждой исходной строки — df.groupby('cat')['x'].transform('sum') сохраняет размер DataFrame. Правило: нужна колонка «показатель по группе рядом с данными» — transform; нужна сводная таблица — agg.

Почему df.apply(func, axis=1) тормозит?

При axis=1 pandas вызывает Python-функцию по одной строке за раз — это цикл на уровне интерпретатора, без векторизации. На миллионе строк это секунды вместо миллисекунд. Замена: векторные операции над колонками (df['a'] + df['b']), np.where для условий, np.select для нескольких веток. apply(axis=1) оставляй только когда логика реально построчная и невекторизуемая.

Что случилось с applymap?

applymap применял функцию к каждой ячейке DataFrame поэлементно. С pandas 2.1.0 он объявлен deprecated — вместо него DataFrame.map (тот же смысл, единое имя с Series.map). На собесе достаточно сказать: «поэлементно по всему фрейму — раньше applymap, теперь DataFrame.map», и что для скорости лучше векторизовать.

Как map с несловарным ключом обработать пропуски?

Series.map(словарь) ставит NaN там, где ключа нет в словаре. Если нужно сохранить исходное значение — используй Series.map(словарь).fillna(исходная_series) или Series.replace, который не трогает не найденные значения. Это частый подвох: map молча превращает неизвестные категории в NaN.

Связанные темы Python

Pandas: основы · Pandas groupby · Pandas merge / join · Pandas: временные ряды · NumPy векторизация · scipy: A/B-тесты · sklearn для аналитика · Графики: matplotlib / seaborn

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