Выбор ответа Senior groupby и агрегаты обновлено
Почему groupby.apply медленный
Вопрос
На 5 млн строк и 2 млн групп df.groupby("user").apply(lambda g: g["amount"].sum()) работает минуты, а df.groupby("user")["amount"].sum() секунды. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: apply вызывает Python-функцию на каждую группу, а sum идёт в Cython. Встроенные агрегаты groupby реализованы в Cython и обрабатывают все группы за один проход. apply для каждой группы создаёт DataFrame-срез и вызывает интерпретатор: накладные расходы умножаются на число групп.
Варианты ответа
applyкаждый раз копирует весь DataFrame целиком, а не только группуapplyвызывает Python-функцию на каждую группу, аsumидёт в Cythonправильный ответapplyне использует индекс и сортирует все данные дважды перед вызовомsumсчитает приближённо по выборке строк, поэтому намного быстрее
Разбор
Встроенные агрегаты groupby реализованы в Cython и обрабатывают все группы за один проход. apply для каждой группы создаёт DataFrame-срез и вызывает интерпретатор: накладные расходы умножаются на число групп. Копии всего DataFrame на каждом шаге нет, сортировка тут не главное, а sum считает точно.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «groupby и агрегаты»
- Отбор клиентов по условиям на группу
- Выручка и число клиентов по городам на pandas
- Доля заказа в выручке города: transform
- Топ-N заказов в каждом городе на pandas
- dropna=False в groupby
- Как работает groupby в pandas
- Оставить группы по условию
- agg, transform, filter, apply: форма результата