Установка и импорт
pip install pandas
import pandas as pd
import numpy as np
Создание DataFrame
# Из словаря
df = pd.DataFrame({
"name": ["Alice", "Bob", "Carol", "David"],
"age": [30, 25, 35, 28],
"salary": [90000, 75000, 110000, 82000],
"dept": ["IT", "HR", "IT", "Finance"],
})
# Из списка словарей
records = [
{"product": "Ноутбук", "price": 50000, "qty": 3},
{"product": "Мышь", "price": 1500, "qty": 15},
{"product": "Монитор", "price": 25000, "qty": 7},
]
df2 = pd.DataFrame(records)
Базовые операции
df.head(3) # первые 3 строки
df.tail(2) # последние 2 строки
df.shape # (4, 4) — строки × столбцы
df.dtypes # типы столбцов
df.info() # сводка: типы, пропуски
df.describe() # статистика для числовых столбцов
# Выбор столбца
df["name"] # Series
df[["name", "age"]] # DataFrame из нескольких столбцов
# Выбор строк
df.iloc[0] # строка по позиции
df.iloc[1:3] # срез строк
df.loc[0] # строка по индексу (label-based)
Фильтрация
# Простое условие
high_salary = df[df["salary"] > 80000]
# Несколько условий (& — AND, | — OR)
it_seniors = df[(df["dept"] == "IT") & (df["age"] > 28)]
# isin()
selected_depts = df[df["dept"].isin(["IT", "Finance"])]
# Исключение
not_hr = df[df["dept"] != "HR"]
# query() — более читабельный синтаксис
result = df.query("salary > 80000 and dept == 'IT'")
Добавление и изменение столбцов
# Новый столбец
df["salary_k"] = df["salary"] / 1000
df["is_senior"] = df["age"] >= 30
# Условный столбец
df["level"] = np.where(df["salary"] >= 100000, "Senior", "Junior")
# apply()
df["name_upper"] = df["name"].apply(str.upper)
df["bonus"] = df["salary"].apply(lambda s: s * 0.1 if s > 80000 else s * 0.05)
# assign() — чейнинг
df = (df
.assign(total = df["salary"] + df["salary"] * 0.1)
.assign(grade = lambda x: x["total"].apply(lambda v: "A" if v > 100000 else "B"))
)
Пропущенные значения
df_messy = pd.DataFrame({
"a": [1, None, 3, None],
"b": [4, 5, None, 7],
})
df_messy.isna() # маска True/False
df_messy.isna().sum() # кол-во пропусков по столбцам
df_messy.dropna() # удалить строки с любым NaN
df_messy.dropna(subset=["a"]) # удалить строки где NaN в "a"
df_messy.fillna(0) # заменить все NaN на 0
df_messy["a"].fillna(df_messy["a"].mean()) # заменить средним
df_messy.fillna(method="ffill") # заполнить предыдущим значением
Группировка (groupby)
# Сумма зарплат по отделам
by_dept = df.groupby("dept")["salary"].sum()
# Несколько агрегаций
stats = df.groupby("dept").agg(
count=("name", "count"),
avg_salary=("salary", "mean"),
max_age=("age", "max"),
)
# transform — добавить агрегат как столбец
df["dept_avg"] = df.groupby("dept")["salary"].transform("mean")
df["above_avg"] = df["salary"] > df["dept_avg"]
Сортировка
# По одному столбцу
df.sort_values("salary", ascending=False)
# По нескольким
df.sort_values(["dept", "salary"], ascending=[True, False])
# Сброс индекса после сортировки
df.sort_values("age").reset_index(drop=True)
Merge (JOIN)
employees = pd.DataFrame({
"emp_id": [1, 2, 3, 4],
"name": ["Alice", "Bob", "Carol", "David"],
"dept_id": [10, 20, 10, 30],
})
departments = pd.DataFrame({
"dept_id": [10, 20, 40],
"dept_name": ["IT", "HR", "Marketing"],
})
# INNER JOIN
inner = pd.merge(employees, departments, on="dept_id")
# LEFT JOIN (все сотрудники, даже без отдела)
left = pd.merge(employees, departments, on="dept_id", how="left")
# Разные имена ключей
pd.merge(df_a, df_b, left_on="user_id", right_on="id")
Pivot Table
sales = pd.DataFrame({
"month": ["Jan", "Jan", "Feb", "Feb", "Mar"],
"product": ["A", "B", "A", "B", "A"],
"revenue": [100, 200, 150, 180, 120],
})
pivot = sales.pivot_table(
values="revenue",
index="month",
columns="product",
aggfunc="sum",
fill_value=0,
)
Временные ряды
dates = pd.date_range("2025-01-01", periods=30, freq="D")
ts = pd.Series(np.random.randn(30), index=dates)
# Срез по датам
ts["2025-01-10":"2025-01-20"]
# Ресэмплинг — агрегация по неделям
weekly = ts.resample("W").sum()
# Скользящ��е среднее
rolling_mean = ts.rolling(window=7).mean()
Практический мини-EDA
import pandas as pd
df = pd.read_csv("sales.csv")
# 1. Быстрый осмотр
print(df.head())
print(df.describe())
print(df.isna().sum())
# 2. Топ-5 продуктов по выручке
top5 = (df
.groupby("product")["revenue"]
.sum()
.sort_values(ascending=False)
.head(5)
)
# 3. Динамика по месяцам
df["date"] = pd.to_datetime(df["date"])
monthly = df.resample("M", on="date")["revenue"].sum()
# 4. Корреляция
print(df[["price", "qty", "revenue"]].corr())
Pandas — стандарт для Data Science в Python. В тренажёре Python Lab раздел Pandas содержит 33 задачи: от базовых операций до group transform, rolling и category dtype оптимизации!