В чем разница между apply и applymap в Pandas?

«В чем разница между apply и applymap в Pandas?» — вопрос из категории Pandas и NumPy, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основное отличие — в уровне применения функции к DataFrame.

  • apply применяет функцию вдоль оси (по умолчанию axis=0, т.е. к каждому столбцу). Функция получает на вход целый Series (столбец или строку) и возвращает одно значение для агрегации или новый Series для преобразования.
  • applymap (в Pandas 2.1.0+ рекомендуется использовать map) применяет функцию к каждому элементу DataFrame поэлементно.

Пример:

import pandas as pd

df = pd.DataFrame({'A': [1, 4], 'B': [9, 16]})
print(df)
#    A   B
# 0  1   9
# 1  4  16

# apply: работаем со столбцами как с целыми объектами
# Находим размах (max - min) для каждого столбца
print(df.apply(lambda col: col.max() - col.min()))
# A    3
# B    7
# dtype: int64

# applymap (map): работаем с каждым элементом отдельно
# Извлекаем квадратный корень из каждого числа
print(df.applymap(lambda x: x ** 0.5))
#      A    B
# 0  1.0  3.0
# 1  2.0  4.0

Практическое правило: Для операций, которые можно выразить через векторизованные операции NumPy или встроенные методы Pandas (например, df * 2, df.sum()), они всегда будут значительно быстрее, чем apply или applymap. apply стоит использовать для сложных, не векторизуемых преобразований на уровне столбцов/строк, а applymap (или map) — для таких же операций, но на уровне отдельных ячеек.