Выбор ответа 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-срез и вызывает интерпретатор: накладные расходы умножаются на число групп.

Варианты ответа

  1. apply каждый раз копирует весь DataFrame целиком, а не только группу
  2. apply вызывает Python-функцию на каждую группу, а sum идёт в Cythonправильный ответ
  3. apply не использует индекс и сортирует все данные дважды перед вызовом
  4. sum считает приближённо по выборке строк, поэтому намного быстрее

Разбор

Встроенные агрегаты groupby реализованы в Cython и обрабатывают все группы за один проход. apply для каждой группы создаёт DataFrame-срез и вызывает интерпретатор: накладные расходы умножаются на число групп. Копии всего DataFrame на каждом шаге нет, сортировка тут не главное, а sum считает точно.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме