Python и pandas на собесе — когда их спрашивают
В 2026 году Python-секция на собесе аналитика встречается всё чаще. Если в SQL-only компаниях (классические банки, ритейл) её ещё могут пропустить, то в продуктовых командах Яндекса, Авито, Озона, Wildberries, Wargaming, Lamoda — почти всегда. И, что важно: pandas-задачи редко бывают «лёгкими». Часто это то же самое, что и в SQL, но с дополнительной заковыкой — нужно вспомнить, как сделать groupby с агрегацией.
В этой статье:
- какие темы спрашивают на Python-секции;
- 8 типов pandas-задач, которые встречаются чаще всего;
- общие Python-вопросы (типы данных, генераторы, lambda);
- задачи на оптимизацию;
- план подготовки;
- литература и типичные ошибки.
Структура Python-секции
В большинстве собесов Python — это одна задача на 30–45 минут. Возможны варианты:
- Чисто pandas-задача: загрузили DataFrame, нужно посчитать метрику.
- Pandas + базовый Python: задача требует и работы с DataFrame, и логики (генератор, словарь).
- Алгоритмическая задача на чистом Python: без pandas, типа LeetCode easy.
- Live coding: пишете код в редакторе с расшариванием экрана.
Опасный момент — компания может молча ждать «pandas-way», а вы напишете цикл for и потеряете балл за не-векторизованный код.
8 типов pandas-задач
1. groupby + agg
Базовая операция. «Средний чек по категории, средний чек по сегменту, средний чек по месяцу». Используется df.groupby('cat').agg({'amount': 'mean'}).
Чуть сложнее: мультигруппировка с несколькими агрегатами:
df.groupby(['region', 'month']).agg(
total=('amount', 'sum'),
avg_check=('amount', 'mean'),
n_orders=('order_id', 'nunique')
)
Тренировка: Habr · groupby + agg.
2. pivot_table
«Месячная выручка по категориям, каждый месяц колонкой». Используется pivot_table с агрегатором.
Часто за этим следует unpivot (melt) — обратная операция, когда нужно «развернуть» wide-формат в long.
Тренировка: Habr · pivot_table, Datainterview · unpivot/melt, LeetCode · pivot revenue by region.
3. merge / join
pd.merge — основной инструмент. Важно понимать разницу между inner, left, right, outer, плюс merge_asof для временных join-ов.
Тренировка: Habr · merge vs join, LeetCode · merge_asof по времени.
4. sessionization
«Сгруппировать события пользователя в сессии: если между событиями прошло > 30 минут — новая сессия». Решается через groupby + diff + cumsum:
df = df.sort_values(['user_id', 'ts'])
df['gap'] = df.groupby('user_id')['ts'].diff() > pd.Timedelta('30min')
df['session_id'] = df.groupby('user_id')['gap'].cumsum()
Тренировка: Python · Воронка из событий, Python · Объединение перекрывающихся событий.
5. retention (когортный анализ)
«Построить retention curve по когортам месяца регистрации». Это самая частая «сложная» задача на собесе. Шаги:
- Определить когорту (дата регистрации).
- Для каждого активного события посчитать
months_since_registration. - Pivot: cohort × month.
Тренировка: Karpov · Retention curve в pandas.
6. funnel conversion
«Конверсия по этапам воронки». Решается через серию фильтраций + подсчёт unique users:
n_search = df[df.event == 'search']['user_id'].nunique()
n_cart = df[df.event == 'add_to_cart']['user_id'].nunique()
n_order = df[df.event == 'order']['user_id'].nunique()
Тренировка: InterviewQuery · pandas funnel conversion.
7. fillna и работа с пропусками
«Заполнить пропуски значением, последним непустым, средним, медианой». Различные стратегии:
df.fillna(0)— нулём;df.fillna(method='ffill')— предыдущим;df.fillna(df.mean())— средним.
Внутри groupby — нужен df.groupby('user').transform(lambda s: s.fillna(method='ffill')). Тренировка: Habr · fillna стратегии, LeetCode · forward fill в группе.
8. RFM-сегментация в pandas
«Разбить пользователей на квантили по Recency, Frequency, Monetary». Используется pd.qcut для квантилей.
Тренировка: InterviewQuery · RFM в pandas.
Базовые Python-вопросы
Series vs DataFrame
«В чём разница, когда какой использовать.» Series — это одномерный объект (как колонка); DataFrame — двумерный. Часто df['col'] возвращает Series, а df[['col']] — DataFrame с одной колонкой.
Тренировка: Habr · Series vs DataFrame.
Mutable default arguments
Классический Python-подвох:
def foo(items=[]):
items.append(1)
return items
Каждый раз при вызове foo() без аргументов список НЕ создаётся заново — он один и тот же. Тренировка: Habr · mutable default arg.
List comprehension vs map
«Что быстрее? Что читабельнее?» Обычно list comprehension читабельнее, а map — слегка быстрее для простых функций.
Тренировка: Habr · list comp vs map.
Итераторы и генераторы
yield, ленивая оценка, как написать свой генератор. Senior-вопрос: чем отличается итератор от генератора.
Тренировка: Python · итератор vs генератор.
Алгоритмические задачи
На собесе аналитика они проще, чем у бэкенда, но могут встретиться:
- FizzBuzz — самая базовая (FizzBuzz).
- Two Sum — поиск двух чисел с заданной суммой (Two Sum).
- Palindrome — проверка строки (Palindrome).
- Поиск дубликатов (Duplicates, Habr · дедуп заказов).
Оптимизация: vectorize vs loop
На middle/senior собесе обязательно спросят: «вот цикл for, как сделать его быстрее?» Обычные ответы:
- Векторизация: вместо
for row in df.iterrows()использоватьdf['col1'] + df['col2']. - apply — медленнее векторизации, но быстрее
iterrows. - numpy для тяжёлых математических операций.
- groupby + transform вместо явных циклов.
Тренировка: Habr · iterrows vs vectorize.
Прочие частые задачи
Rolling mean и аномалии
«Найти аномальные точки через скользящее среднее». Тренировка: Habr · rolling mean.
Group by месяцам
«Помесячная агрегация продаж.» Тренировка: LeetCode · group by month.
Top-N в группе
«Топ-3 продукта в каждой категории.» Тренировка: LeetCode · top-N per group.
Чек-лист подготовки на 3 недели
Неделя 1: pandas основы
- groupby, agg, merge, pivot, melt.
- 15 задач: groupby, pivot, merge vs join, unpivot, group by month, top-N per group, pivot revenue.
Неделя 2: продуктовые pandas-задачи
- sessionization, retention, funnel, RFM.
- 10 задач: воронка из событий, retention curve, funnel в pandas, RFM в pandas, объединение событий, rolling mean, fillna, merge_asof, forward fill, дедуп заказов.
Неделя 3: Python теория и оптимизация
- 5 теоретических вопросов: Series vs DataFrame, mutable default, list comp vs map, vectorize, генератор.
- 5 алгоритмических задач: FizzBuzz, Two Sum, Palindrome, Duplicates.
- Mock-интервью на 45 минут.
Что почитать
- «Python for Data Analysis» Wes McKinney — каноническая книга по pandas от автора библиотеки.
- «Fluent Python» Luciano Ramalho — для понимания Python-механики.
- Курс «Симулятор аналитика» Karpov.Courses — много pandas-практики.
- Документация pandas — особенно раздел «Group By: split-apply-combine».
Типичные ошибки
- Пишут циклы для DataFrame. В pandas почти всегда есть векторизованное решение.
- Путают
.locи.iloc..loc— по меткам,.iloc— по позициям. - Меняют DataFrame в цикле. Получают
SettingWithCopyWarningи багов. - Используют
applyгде можноagg. Apply медленнее. - Не помнят про
index_reset. После groupby/pivot часто индекс ломается. - Забывают про
merge_asof. Для временных join-ов это спасение. - Не знают, что
df['col']копия или ссылка. Это причина 70% багов в pandas.
Топ-инсайт: типы данных
Pandas хранит числа в int64 или float64, строки — в object. Если у вас миллион строк типа object — это очень медленно. На большие данные нужно использовать category для строковых колонок с малой кардинальностью.
На сеньорном собесе про это могут спросить.
Связанные задачи каталога
Полный пул для тренировки:
- Основы pandas: groupby agg, pivot table, merge vs join, unpivot melt, group by month, pivot revenue, top-N per group, merge_asof.
- Продуктовые: воронка из событий, retention curve, funnel pandas, RFM pandas, объединение событий, rolling mean, fillna strategies, forward fill, дедуп заказов.
- Python теория: Series vs DataFrame, mutable default, list comp vs map, vectorize, iterator vs generator.
- Алгоритмы: FizzBuzz, Two Sum, Palindrome, Duplicates.
Несколько хитрых паттернов pandas
merge_asof для «ближайшего по времени»
Если вам нужно склеить две таблицы, где даты не совпадают точно (например, события и метеорологические измерения по часу), pd.merge_asof спасает. Поддерживает direction='backward'/'forward'/'nearest'.
transform vs apply vs aggregate
agg— сжимает группу до одной строки.transform— возвращает строку для каждой исходной строки, в её размер.apply— самый гибкий, но самый медленный.
Понимание разницы — must-have для middle.
shift и diff внутри groupby
«Разница между текущей и предыдущей покупкой пользователя»:
df['days_diff'] = df.groupby('user_id')['order_date'].diff().dt.days
Это эквивалент LAG в SQL, и спрашивают очень часто.
qcut и cut для квантилей
pd.qcut(s, 4) — четыре равных по числу наблюдений квантиля. pd.cut(s, bins=[0, 100, 1000, 10000]) — по фиксированным границам. Для RFM используется первый.
explode для списков
Если в одной ячейке лежит список (например, tags), df.explode('tags') разворачивает в отдельные строки. Очень полезно для JSON-данных.
Python-секция в разных компаниях
Стиль Python-секции зависит от компании:
- Яндекс: ближе к алгоритмам, pandas попроще.
- Авито: pandas + бизнес-кейс в одном задании.
- Озон: classic pandas, sessionization и retention.
- Wildberries: много задач на оптимизацию (большие объёмы данных).
- Тинькофф: pandas редко спрашивают, чаще SQL.
Зная это, можно настраивать подготовку под конкретный собес.
Пара хитростей для live-coding
-
Импорты в начале. Не забудьте
import pandas as pdиimport numpy as npв первой ячейке. -
Проверяйте промежуточные результаты.
print(df.head())после каждого шага — нормально, и интервьюеру это нравится. -
Если зависли — проговаривайте план. «Сейчас я хочу сделать join, потом groupby, потом filter» — даже если код не пишется, интервьюер видит мышление.
-
Не стесняйтесь спросить про размер данных. «Это 100 строк или 100 миллионов?» — определяет, нужна ли оптимизация.
Итого
Python/pandas — это секция, где «механика» важнее «глубоких знаний». Если вы знаете 10 основных операций (groupby, merge, pivot, melt, fillna, sort, cumsum, diff, transform, agg) и понимаете, когда какую использовать — 80% задач сделаете. Остальные 20% — это специфика (sessionization, retention, оптимизация), которой тренироваться по 3 недели. После этого pandas-секцию на любом собесе вы пройдёте уверенно.