Ответ вслух Middle merge, join и concat спрашивают часто обновлено

Как безопасно соединять таблицы в pandas

Вопрос

Вам нужно соединить заказы с клиентами и справочником тарифов. Как сделаете, чтобы не потерять и не размножить строки?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Беру таблицу фактов, заказы, за левую и соединяю how="left", чтобы ни один заказ не пропал. Перед этим проверяю справочники: ключ должен быть уникальным, и я явно пишу validate="manytoone", тогда дубликаты в справочнике сразу упадут ошибкой, а не тихо размножат заказы.

Что должно прозвучать в ответе

  • Выбор `how` под вопрос: обычно `left` от таблицы фактов

  • Проверка уникальности ключа справочника, `validate="many_to_one"`

  • Сравнение числа строк до и после

  • Типы и чистота ключей: `astype`, `strip`, регистр

  • `indicator=True`, чтобы посчитать строки без пары

  • Фильтры по правой таблице с учётом NaN

Что могут спросить следом

  • Что будет, если в справочнике тарифов есть история версий?
  • Как найти клиентов без заказов?
  • Почему после merge суммы выручки выросли?

Разбор

Беру таблицу фактов, заказы, за левую и соединяю how="left", чтобы ни один заказ не пропал. Перед этим проверяю справочники: ключ должен быть уникальным, и я явно пишу validate="many_to_one", тогда дубликаты в справочнике сразу упадут ошибкой, а не тихо размножат заказы. Сверяю len до и после. Проверяю типы ключей: число против строки pandas не соединит, а строки с пробелами молча не совпадут. Добавляю indicator=True и смотрю, сколько заказов не нашли клиента, это часто баг в данных. Если у тарифов есть история версий, обычный merge размножит строки, тогда нужен merge_asof по дате или фильтр актуальной версии. И помню, что фильтр == по колонке правой таблицы после left join выкинет строки с NaN.

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

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