Что делает LEFT JOIN в SQL
Что проверяют
Понимаете ли вы семантику внешнего соединения и переносите ли её на инструменты, с которыми работаете каждый день: pandas и SQLAlchemy. Питонисту этот вопрос задают не ради определения, а чтобы проверить, как вы собираете данные из разных источников.
Как отвечать
LEFT JOIN возвращает все строки левой таблицы, а там, где справа пары нет, подставляет NULL.
select c.name, o.total
from customers c
left join orders o on o.customer_id = c.id;Прямой аналог в pandas:
df = customers.merge(orders, how="left", left_on="id", right_on="customer_id")Пропуски приедут как NaN, и это стоит сказать самому: целочисленный столбец с пропусками повышается до float64, если не взять тип Int64. Поиск клиентов без заказов делается через isna, а не через сравнение с None. В SQLAlchemy то же соединение записывается как outerjoin, который и означает левое внешнее.
Добавьте главную мысль: соединение это не «приклеить столбцы сбоку». Если справа на один ключ приходится несколько строк, левая строка размножится, и число строк вырастет.
Где спотыкаются
Уверены, что после how="left" количество строк не изменится. Оно не изменится только при уникальном ключе справа, иначе строки дублируются. Привычка сверять длину до и после и указывать validate="one_to_many" снимает половину ошибок в отчётах.
Второе: сравнивают пропуски через равенство. NaN не равен сам себе, фильтр по == None вернёт пустоту, нужен isna. В SQL та же ловушка с = NULL вместо is null.
Третье: тянут обе таблицы в память и соединяют средствами pandas, когда соединение должна была сделать база. Полмиллиона строк с каждой стороны по сети это не оптимизация, а перенос работы туда, где нет индексов.