Шпаргалка по pandas для аналитика: чтение данных, фильтрация, groupby, merge, pivot, даты и строки — все рабочие методы в таблицах с примерами. Это те 20% pandas, которые закрывают 80% рабочих задач и почти всю Python-секцию собеседования.
Формат — справочник: находишь задачу в таблице, копируешь метод, проверяешь на своих данных. Тренировать всё это на реальных задачах можно в Python-тренажёре — pandas работает прямо в браузере, ничего ставить не нужно.
Series и DataFrame: база
| Задача | Код |
|---|---|
| Прочитать CSV | pd.read_csv('data.csv', parse_dates=['dt']) |
| Первые строки / структура | df.head(), df.info(), df.describe() |
| Размер | df.shape |
| Уникальные значения | df['city'].unique(), df['city'].nunique() |
| Частоты значений | df['city'].value_counts() |
| Типы колонок | df.dtypes, df['col'].astype('int64') |
Фильтрация и выбор
| Задача | Код |
|---|---|
| Фильтр по условию | df[df['amount'] > 1000] |
| Несколько условий | df[(df['amount'] > 1000) & (df['city'] == 'Москва')] |
| Значение из списка | df[df['status'].isin(['paid', 'shipped'])] |
| Строки с NULL / без | df[df['email'].isna()], df[df['email'].notna()] |
| Выбор колонок | df[['user_id', 'amount']] |
| По меткам / позициям | df.loc[rows, cols], df.iloc[0:5, 0:2] |
| Строки по подстроке | df[df['name'].str.contains('про', case=False)] |
Два классических подвоха: условия соединяются & и | (не and/or) и каждое условие — в скобках; предупреждение SettingWithCopyWarning лечится явным .copy() или присваиванием через .loc.
GroupBy: сердце аналитики
| Задача | Код |
|---|---|
| Одна агрегация | df.groupby('city')['amount'].sum() |
| Несколько агрегатов | df.groupby('city').agg(orders=('id', 'count'), revenue=('amount', 'sum')) |
| Агрегат без схлопывания (как оконная в SQL) | df['city_avg'] = df.groupby('city')['amount'].transform('mean') |
| Топ-N в каждой группе | df.sort_values('amount', ascending=False).groupby('city').head(3) |
| Фильтр групп (как HAVING) | df.groupby('city').filter(lambda g: g['amount'].sum() > 1e6) |
Правило производительности: если для задачи есть готовый метод (sum, mean, transform) — не пиши apply с lambda: он до 100 раз медленнее.
Merge: соединение таблиц
| SQL | pandas |
|---|---|
| INNER JOIN | pd.merge(a, b, on='key') |
| LEFT JOIN | pd.merge(a, b, on='key', how='left') |
| FULL JOIN | pd.merge(a, b, on='key', how='outer') |
| Разные имена ключей | pd.merge(a, b, left_on='uid', right_on='user_id') |
| Вертикальная склейка (UNION ALL) | pd.concat([a, b], ignore_index=True) |
Как и в SQL, следи за дублями ключей в правой таблице-справочнике — строки размножатся (fan-out). Проверка: pd.merge(..., validate='many_to_one') требует уникальности ключа в правой таблице и кинет ошибку, если там есть дубли. Разбор всех вариантов — в гайде по pandas merge.
Pivot и melt: длинный и широкий формат
| Задача | Код |
|---|---|
| Сводная таблица | df.pivot_table(index='month', columns='city', values='amount', aggfunc='sum') |
| Широкий → длинный | df.melt(id_vars=['month'], var_name='city', value_name='amount') |
| Кросс-таблица частот | pd.crosstab(df['city'], df['status']) |
pivot_table против pivot: pivot_table умеет агрегировать дубли (aggfunc), pivot упадёт с ошибкой при повторах пары индекс-колонка — на собеседовании это любят спрашивать.
Даты и время
| Задача | Код |
|---|---|
| Строка → дата | pd.to_datetime(df['dt']) |
| Округлить до месяца | df['dt'].dt.to_period('M') |
| Год, месяц, день недели | df['dt'].dt.year, .dt.month, .dt.dayofweek |
| Агрегация по неделям | df.resample('W', on='dt')['amount'].sum() |
| Скользящее среднее за 7 точек | df['amount'].rolling(7).mean() |
| Разница дат | (df['end'] - df['start']).dt.days |
Пропуски и дубликаты
| Задача | Код |
|---|---|
| Сколько пропусков в колонках | df.isna().sum() |
| Заполнить пропуски | df['amount'].fillna(0), df['city'].fillna('unknown') |
| Удалить строки с NULL | df.dropna(subset=['user_id']) |
| Найти дубликаты | df.duplicated(subset=['user_id', 'dt']).sum() |
| Удалить дубликаты | df.drop_duplicates(subset=['user_id'], keep='first') |
Стратегия заполнения пропусков — вопрос про данные, а не про код: средним заполняют только когда пропуски случайны, для скошенных распределений берут медиану, и почти всегда полезнее сначала понять, почему данные пропали.
Что спрашивают на собеседовании по pandas
Топ-5 тем Python-секции аналитика: groupby с несколькими агрегатами, merge и его подвохи с дублями, transform против apply, pivot_table, обработка пропусков. Прогнать все темы на реальных задачах можно в Python-тренажёре, а разбор groupby по шагам — в отдельном гайде.
Частые вопросы
Чем transform отличается от apply в groupby?
transform возвращает результат той же длины, что исходные данные — агрегат «приписывается» каждой строке группы, как оконная функция в SQL. apply гибче (может вернуть что угодно), но заметно медленнее и его легко использовать там, где хватает встроенного агрегата. Правило: сначала ищи готовый метод, apply — последний вариант.
Как в pandas сделать аналог оконной функции SQL?
ROW_NUMBER — это groupby + cumcount, нарастающий итог — groupby + cumsum, LAG — groupby + shift, скользящее среднее — rolling. Например, номер заказа внутри клиента: df.sort_values('dt').groupby('user_id').cumcount() + 1.
pandas или SQL — что использовать для анализа?
Правило большинства команд: тяжёлую выборку и агрегацию делает SQL на стороне базы, pandas берёт уже уменьшенный датасет для статистики, когорт и визуализации. Тянуть сырые миллионы строк в pandas — антипаттерн: память кончится раньше, чем начнётся анализ. Подробное сравнение — в гайде SQL vs pandas.
Где практиковать pandas бесплатно?
В Python-тренажёре — первые задачи открыты без регистрации, pandas и numpy работают в браузере через Pyodide. Плюс бесплатный курс по pandas с интерактивными примерами.