В чем разница между методами map и apply в pandas
Что проверяют
Знаете ли вы, на каком уровне работает каждый метод и что оба это цикл на Python, а не векторизация. Следом почти всегда спрашивают, как ускорить код, где apply(axis=1) крутится на миллионе строк.
Как отвечать
Разведите методы по объектам и по тому, что получает функция:
Series.map: поэлементное преобразование. Принимает не только функцию, но и словарь или другую Series, это удобный способ перекодировать значения. Значения, которых нет в словаре, превращаются вNaN. Параметрna_action="ignore"пропускает пропуски, не передавая их в функцию;Series.apply: тоже поэлементно, но умеет передавать в функцию дополнительные аргументы черезargsиkwargs. Словарь в роли таблицы замены он не понимает;DataFrame.apply: функция получает целый столбец (axis=0, по умолчанию) или целую строку (axis=1) в виде Series. Вернёт скаляр, получится Series, вернёт Series, получится DataFrame;DataFrame.map: поэлементно по всей таблице. В pandas 2.1 так переименовалиapplymap, старое имя объявлено устаревшим.
Главное про скорость. Ни map, ни apply не векторизуют вычисление: функция вызывается из Python для каждого элемента или строки. Поэтому сначала ищите векторный вариант: арифметику над столбцами, аксессоры .str и .dt, np.where и np.select для условий, pd.cut для бинов, merge вместо поиска по словарю в цикле. apply(axis=1) особенно дорог, потому что на каждую строку собирается объект Series. На больших таблицах разница с векторным кодом измеряется десятками и сотнями раз.
Где спотыкаются
Утверждают, что apply векторизован и потому быстрее цикла for. Выигрыш над обычным циклом у него небольшой, а настоящей векторизации он проигрывает многократно.
Перекодируют через map со словарём и не замечают, что все значения вне словаря молча стали NaN. Если остальное нужно сохранить, используйте replace или добавьте .fillna(s).
Пишут df.apply(func, axis=1) для сложения двух колонок, хотя df["a"] + df["b"] делает то же самое на порядки быстрее.