Шпаргалка Python для аналитика
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'] # TimedeltaApply и 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'])Статистика
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— экономит память. - Даункастите целые числа (
int64→int32), если диапазон значений это позволяет. - Читайте только нужные колонки (
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. Остальное подтягивается по мере надобности.