Вопрос с собеседования · Аналитика данных

Как работают groupby и merge в pandas и какие у них ловушки?

JuniorPython и pandaspandas
Ещё спрашивают так:
  • Чем merge отличается от join и concat в pandas?
Коротко

groupby — разбить, применить агрегат, собрать (split-apply-combine): df.groupby("city")["amount"].agg(["sum", "mean"]). merge — соединение таблиц по ключам, как SQL JOIN (how="left", on=). Ловушки: размножение строк при дублях ключа, NaN-ключи отбрасываются в groupby по умолчанию, типы ключей не совпадают (строка и число).

  • merge(..., validate="many_to_one") проверяет кратность связи
  • indicator=True показывает, из какой таблицы пришла строка
  • groupby(..., dropna=False) — не терять группу с пропущенным ключом

А ещё concat склеивает таблицы по строкам или столбцам, join — merge по индексу

Подробно

Именованные агрегаты (agg(revenue=("amount", "sum"))) дают читаемые столбцы без мультииндекса.

transform возвращает результат той же длины, что исходная таблица: df["share"] = df["amount"] / df.groupby("user_id")["amount"].transform("sum") — аналог оконной функции.

Ловушки merge:

  • дубли ключа в правой таблице размножают строки — validate ловит это сразу;
  • ключ user_id как int в одной таблице и str в другой — пустой результат без ошибки;
  • одинаковые имена столбцов получают суффиксы _x, _y;
  • после left merge строки без пары имеют NaN, и целочисленные столбцы превращаются в float.

Проверка после соединения: сравнить число строк до и после, посмотреть indicator и долю left_only.

Пример

orders.merge(users, on="user_id", how="left",
             validate="many_to_one", indicator=True)

(orders
   .groupby(["city", "month"], dropna=False)
   .agg(revenue=("amount", "sum"),
        buyers=("user_id", "nunique"),
        median_check=("amount", "median"))
   .reset_index())

Что хотят услышать

  • Принцип split-apply-combine, agg и transform.
  • Типы соединений и validate.
  • Проверка результата.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗merge по умолчанию делает левое соединение и сохраняет все строки левой таблицы
  • ✓Дубли ключа в merge размножают строки
  • ✓groupby по умолчанию отбрасывает NaN-ключи
  • ✓Разные типы ключей (строка и число) ломают соединение

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования