Шпаргалка Python для аналитика

Проверь себя · 1/3разбор после ответа
Дан список nums = [10, 20, 30, 40]. Чему равен результат выражения nums[1:3]?

Зачем это знать

Python — второй по важности инструмент аналитика данных после SQL. Как только данные не помещаются в один запрос или нужна нетривиальная трансформация, визуализация и статистика, аналитик уходит в pandas. Эта шпаргалка — набор готовых сниппетов под ежедневные задачи: чтение данных, фильтры, группировки, джойны, работа с датами и строками, статистика и графики. Держите её под рукой и копируйте нужное, а не вспоминайте синтаксис по памяти.

Основы pandas

Чтение

import pandas as pd

df = pd.read_csv('file.csv')
df = pd.read_excel('file.xlsx')
df = pd.read_parquet('file.parquet')
df = pd.read_sql('SELECT ...', conn)

Запись

df.to_csv('out.csv', index=False)
df.to_parquet('out.parquet')
df.to_excel('out.xlsx')

Осмотр данных

df.head(10)
df.shape          # (строк, колонок)
df.info()         # типы, пропуски
df.describe()     # статистика
df.columns
df.dtypes

Выбор данных

Колонки

df['col']              # одна колонка (Series)
df[['a', 'b']]         # несколько колонок (DataFrame)
df.col                 # то же, что df['col']

Строки

df.iloc[0]             # первая строка
df.iloc[0:5]           # первые 5 строк
df.loc[df['a'] > 10]   # булев индекс
df.query('a > 10')     # синтаксис query

Комбинированный выбор

df.loc[df['a'] > 10, ['b', 'c']]  # фильтр строк + выбор колонок
df.iloc[0:5, 0:3]                  # по позиции

Фильтрация

df[df['age'] > 30]
df[df['country'].isin(['RU', 'US'])]
df[df['name'].str.contains('Ivan')]
df[df['email'].str.endswith('.com')]
df[df['date'] > '2026-01-01']

Группировка и агрегация

df.groupby('country').size()
df.groupby('country')['revenue'].sum()
df.groupby('country').agg({'revenue': 'sum', 'orders': 'count'})
df.groupby(['country', 'product']).mean()

Несколько агрегаций

df.groupby('country').agg({
    'revenue': ['sum', 'mean', 'max'],
    'orders': 'count'
})

Джойны и объединение

pd.merge(df1, df2, on='user_id')
pd.merge(df1, df2, on='user_id', how='left')
pd.merge(df1, df2, left_on='id', right_on='user_id')

# Конкатенация
pd.concat([df1, df2], axis=0)  # по строкам
pd.concat([df1, df2], axis=1)  # по колонкам

Сводные таблицы (pivot)

df.pivot_table(
    values='revenue',
    index='country',
    columns='product',
    aggfunc='sum'
)

Изменение формы (reshape)

df.melt(id_vars=['date'], value_vars=['a', 'b'])  # широкий → длинный формат

Операции со строками

df['col'].str.upper()
df['col'].str.lower()
df['col'].str.contains('pattern')
df['col'].str.replace('a', 'b')
df['col'].str.split('-', expand=True)
df['col'].str.len()

Даты

df['date'] = pd.to_datetime(df['date'])

df['date'].dt.year
df['date'].dt.month
df['date'].dt.day
df['date'].dt.weekday
df['date'].dt.hour

# Разница дат
df['date2'] - df['date1']  # Timedelta

Apply и transform

df['new'] = df['col'].apply(lambda x: x * 2)
df['new'] = df.apply(lambda row: row['a'] + row['b'], axis=1)

# Быстрее: векторизация
df['new'] = df['a'] + df['b']

Пропущенные значения

df.isnull().sum()       # посчитать пропуски
df.dropna()             # удалить строки с пропусками
df.dropna(subset=['a']) # только если пропуск в колонке a
df.fillna(0)            # заменить на 0
df['a'].fillna(df['a'].mean())  # заполнить средним

Сортировка

df.sort_values('col')
df.sort_values('col', ascending=False)
df.sort_values(['a', 'b'], ascending=[True, False])

Уникальные значения и дубли

df['col'].unique()
df['col'].nunique()
df.duplicated()          # булев результат
df.drop_duplicates()
df.drop_duplicates(subset=['a'])
Закрепи Python для аналитика
200+ задач по pandas, numpy и работе с данными — с разборами
Тренировать Python в Telegram

Статистика

df['col'].mean()
df['col'].median()
df['col'].std()
df['col'].var()
df['col'].min()
df['col'].max()
df['col'].quantile(0.95)
df['col'].count()
df.corr()                # матрица корреляций

Подсчёт значений

df['col'].value_counts()
df['col'].value_counts(normalize=True)  # доли

Условные значения

df['new'] = df['col'].apply(lambda x: 'high' if x > 10 else 'low')

# Векторизованно
df['new'] = np.where(df['col'] > 10, 'high', 'low')

# Несколько условий
conditions = [df['col'] > 100, df['col'] > 10]
choices = ['high', 'medium']
df['new'] = np.select(conditions, choices, default='low')

Основы numpy

import numpy as np

np.array([1, 2, 3])
np.zeros(10)
np.ones((3, 3))
np.arange(10)
np.linspace(0, 1, 100)

# Операции
arr.sum(), arr.mean(), arr.std()

# Случайные числа
np.random.rand(10)
np.random.randn(10)
np.random.choice(arr, 5)

Основы matplotlib

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
plt.plot(df['x'], df['y'])
plt.title('Заголовок')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

# Несколько графиков
fig, axes = plt.subplots(2, 2)
axes[0, 0].plot(...)

seaborn

import seaborn as sns

sns.set_theme(style='whitegrid')
sns.lineplot(data=df, x='date', y='value')
sns.barplot(data=df, x='cat', y='count')
sns.heatmap(df.corr(), annot=True)
sns.boxplot(data=df, x='group', y='value')

Регулярные выражения

import re

re.search(r'\d+', text)
re.findall(r'\w+', text)
re.sub(r'\d+', 'N', text)

# В pandas
df['col'].str.extract(r'(\d+)')

Статистические функции

from scipy import stats

stats.ttest_ind(a, b)
stats.chi2_contingency(table)
stats.pearsonr(x, y)
stats.norm.cdf(value, loc, scale)

Полезное из scipy / sklearn

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier

Частые паттерны

Скользящие окна (time series)

df['ma7'] = df['value'].rolling(7).mean()
df['ema'] = df['value'].ewm(span=7).mean()

Разбиение на перцентили

df['decile'] = pd.qcut(df['value'], 10, labels=False)
df['quartile'] = pd.qcut(df['value'], 4, labels=['Q1', 'Q2', 'Q3', 'Q4'])

Операции по строкам

df['total'] = df[['a', 'b', 'c']].sum(axis=1)
df['max'] = df[['a', 'b', 'c']].max(axis=1)

Сдвиг (shift / lag)

df['prev'] = df['col'].shift(1)
df['diff'] = df['col'] - df['col'].shift(1)

Ранжирование

df['rank'] = df['col'].rank(ascending=False)
df['pct_rank'] = df['col'].rank(pct=True)

Советы по производительности

  • Векторизуйте операции — избегайте циклов по строкам, это в разы медленнее.
  • Используйте .loc, а не chained indexing (df[...][...]) — иначе получите предупреждение и непредсказуемую запись.
  • Для строк с малой кардинальностью используйте тип category — экономит память.
  • Даункастите целые числа (int64int32), если диапазон значений это позволяет.
  • Читайте только нужные колонки (usecols в read_csv) — не тяните весь файл в память.

Полезные импорты

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
import warnings
warnings.filterwarnings('ignore')

Хотите не просто держать шпаргалку под рукой, а довести синтаксис до автоматизма — загляните в тренажёр Карьерника. Там задачи на Python и pandas с разборами под собеседования.

Связанные темы

FAQ

pandas 1 или 2?

Ставьте pandas 2.0+: он быстрее, лучше работает с памятью и опирается на Arrow-типы. Часть дефолтов поменялась (например, поведение при копировании), так что при переезде со старого кода стоит прогнать тесты. Для новых проектов вопрос не стоит — только 2.x.

Polars или pandas?

pandas — индустриальный стандарт: его знают все, под него написана вся документация и большинство вакансий требуют именно его. Polars быстрее на больших данных за счёт ленивых вычислений и Rust-ядра, но пока это скорее «второй инструмент». Для собеседований и повседневной работы учите pandas, Polars — приятный бонус.

Нужны ли Jupyter-ноутбуки?

Да, для исследования данных это стандарт: код и результаты рядом, графики прямо под ячейкой. Jupyter удобен для разведки и прототипов; для продакшн-пайплайнов код обычно выносят в обычные .py-модули. VS Code умеет открывать ноутбуки нативно через расширение.

Что важнее для аналитика — pandas или SQL?

SQL первичен: большая часть данных живёт в базах, и без него не пройти ни один собес. pandas подключается там, где SQL неудобен — сложные трансформации, статистика, визуализация, работа с локальными файлами. На практике аналитик постоянно переключается между ними.

С каких методов pandas начать?

С базы, которая закрывает 80% задач: read_csv/read_sql, фильтрация булевым индексом, groupby + agg, merge, sort_values, value_counts и работа с датами через pd.to_datetime. Остальное подтягивается по мере надобности.