Ответ
Основное отличие — в уровне применения функции к 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) — для таких же операций, но на уровне отдельных ячеек.