map — только для Series, поэлементная замена по словарю/функции. apply — для DataFrame или groupby, функция получает целую строку/столбец/группу и возвращает что угодно (скаляр, Series, фрейм). transform — обязан вернуть тот же размер, что вход: удобно писать результат группы обратно в каждую строку (например, среднее по группе рядом с каждой записью).
agg сворачивает группу в одно значение — df.groupby('cat')['x'].agg('sum') даёт одну строку на категорию. transform возвращает значение для каждой исходной строки — df.groupby('cat')['x'].transform('sum') сохраняет размер DataFrame. Правило: нужна колонка «показатель по группе рядом с данными» — transform; нужна сводная таблица — agg.
При axis=1 pandas вызывает Python-функцию по одной строке за раз — это цикл на уровне интерпретатора, без векторизации. На миллионе строк это секунды вместо миллисекунд. Замена: векторные операции над колонками (df['a'] + df['b']), np.where для условий, np.select для нескольких веток. apply(axis=1) оставляй только когда логика реально построчная и невекторизуемая.
applymap применял функцию к каждой ячейке DataFrame поэлементно. С pandas 2.1.0 он объявлен deprecated — вместо него DataFrame.map (тот же смысл, единое имя с Series.map). На собесе достаточно сказать: «поэлементно по всему фрейму — раньше applymap, теперь DataFrame.map», и что для скорости лучше векторизовать.
Series.map(словарь) ставит NaN там, где ключа нет в словаре. Если нужно сохранить исходное значение — используй Series.map(словарь).fillna(исходная_series) или Series.replace, который не трогает не найденные значения. Это частый подвох: map молча превращает неизвестные категории в NaN.
Pandas: основы · Pandas groupby · Pandas merge / join · Pandas: временные ряды · NumPy векторизация · scipy: A/B-тесты · sklearn для аналитика · Графики: matplotlib / seaborn
Открыть весь Python-тренажёр (556 задач) →