Python Lab

Pandas DataFrame: полное руководство с примерами

Создание, фильтрация, группировка, merge, pivot — всё что нужно для работы с данными в Pandas.

20 января 2026 г.·13 мин чтения
pandasdataframedata scienceанализ данных

Установка и импорт

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 оптимизации!

Хочешь закрепить знания?

Попробуй решить задачи на Python в интерактивном тренажёре

К задачам