Pandas это библиотека Python для работы с таблицами: она читает CSV и Excel, чистит данные, считает итоги по группам и склеивает таблицы между собой. Ставится одной командой pip install pandas, подключается строкой import pandas as pd, а главный объект в ней называется DataFrame, это таблица со строками и столбцами. Удобнее всего работать в Jupyter Notebook, где результат каждого шага виден сразу.
Ниже разберём, что умеет pandas, какие методы нужны в первую очередь и что поменялось в версии 3.0. Примеры написаны для pandas 3.1.0 и Python 3.14. Если Python у вас ещё не стоит, начните с инструкции, как скачать и установить Python.
SkillboxПрофессия «Data Scientist PRO»224 595 ₽12 месяцев
НетологияПрофессия «Аналитик данных с нуля до middle»145 600 ₽12 месяцев
ЭдюсонData Scientist109 900 ₽9 месяцев
SkillFactoryАналитик данных131 814 ₽6 месяцев
GeekBrainsДО Профессия Data Scientist с нуля до Junior115 771 ₽2 месяца
SF EducationАналитик данных + ИИ77 000 ₽4 месяца
Что такое pandas и зачем он нужен

Библиотеку начали писать в 2008 году в инвестиционной компании AQR Capital Management, к концу 2009-го код открыли, а с 2015 года проект поддерживает фонд NumFOCUS. Это есть на странице «О проекте» на сайте pandas. По-русски название читают «пандас».
Pandas нужен там, где данных больше, чем удобно листать глазами. Аналитик выгружает 200 тысяч заказов из CRM, а pandas за пару строк кода показывает выручку по городам, находит дубли и строит сводную таблицу. В Excel ту же работу пришлось бы повторять руками при каждой новой выгрузке.
Вот какие задачи закрывают основные методы:
| Задача | Метод или функция |
|---|---|
| Загрузить таблицу из файла | pd.read_csv(), pd.read_excel() |
| Посмотреть первые строки и типы столбцов | head(), info() |
| Получить сводную статистику | describe(), value_counts() |
| Отобрать строки по условию | df[условие], loc[], query() |
| Найти и заполнить пропуски | isna(), fillna(), dropna() |
| Удалить дубли | duplicated(), drop_duplicates() |
| Посчитать итоги по группам | groupby(), agg() |
| Построить сводную таблицу | pivot_table() |
| Соединить две таблицы | merge(), concat() |
| Сохранить результат | to_csv(), to_excel() |
Внутри pandas опирается на NumPy, поэтому числовые столбцы считаются быстро: операция применяется ко всему столбцу сразу, без цикла по строкам.
Курсы, где pandas разбирают на реальных датасетах с заданиями, собраны в каталоге курсов по pandas.
Как установить библиотеку и проверить версию
Pandas не входит в стандартную поставку Python, его ставят отдельно. Порядок такой:
- Создайте и активируйте виртуальное окружение venv, чтобы библиотека встала в проект, а не в систему.
- Выполните в терминале
pip install pandas. Вместе с pandas встанет NumPy. Если в системе несколько версий Python, запускайте pip через нужный интерпретатор:python -m pip install pandas. Такую форму команды приводит документация Python по установке модулей. - Если собираетесь читать и сохранять файлы Excel, добавьте
pip install openpyxlили сразуpip install "pandas[excel]". - Проверьте версию в Python.
import pandas as pd
print(pd.__version__)
3.1.0
Команды установки через pip и conda, а также список дополнительных пакетов для Excel, Parquet и баз данных есть в официальной инструкции по установке. Последняя версия на PyPI, pandas 3.1.0, вышла 22 октября 2026 года и требует Python 3.11 или новее, это видно на странице пакета.
Не хотите ничего ставить на компьютер? Можно работать в облачном ноутбуке, об этом отдельная инструкция: как запустить Jupyter онлайн без установки.
Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединитьсяSeries и DataFrame: две основные структуры
В pandas две главные структуры данных. Series это один столбец: значения плюс подписи к ним, которые называются индексом. Похоже на список Python, только у каждого элемента есть имя.
s = pd.Series([120, 340, 90], index=["Москва", "Казань", "Пермь"])
print(s)
print(s["Казань"])
Москва 120
Казань 340
Пермь 90
dtype: int64
340
DataFrame это таблица из нескольких Series с общим индексом. Проще всего собрать её из словаря, где ключ становится названием столбца:
df = pd.DataFrame({
"город": ["Москва", "Казань", "Пермь"],
"заказы": [120, 340, 90],
})
print(df)
print(df.dtypes)
город заказы
0 Москва 120
1 Казань 340
2 Пермь 90
город str
заказы int64
dtype: object
Слева номера строк 0, 1, 2, это индекс по умолчанию. Строка dtype показывает тип каждого столбца. Столбец с городами получил тип str, так pandas работает начиная с версии 3.0, до неё такой столбец имел тип object.
Как загрузить таблицу из CSV и Excel
На практике таблицу почти никогда не набирают руками, её читают из файла. Для примеров мы собрали файл sales.csv с русскими настройками: разделитель точка с запятой, дробная часть через запятую, пробел между тысячами, кодировка Windows-1251. Что такое CSV и чем он отличается от таблицы Excel, мы разбирали в статье о формате CSV.
Если прочитать такой файл без параметров, pandas упадёт на первом же байте:
df = pd.read_csv("sales.csv")
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in position 0: invalid continuation byte
По умолчанию pandas ждёт кодировку UTF-8. Указываем encoding="cp1251", и файл читается, но в один столбец:
df = pd.read_csv("sales.csv", encoding="cp1251")
print(df.shape)
print(df.columns.tolist())
(6, 1)
['дата;город;менеджер;сумма']
Всё дело в разделителе: pandas ищет запятую, а в файле точка с запятой. Рабочий вариант выглядит так:
df = pd.read_csv("sales.csv", encoding="cp1251", sep=";", decimal=",", thousands=" ")
print(df.head(3))
дата город менеджер сумма
0 03.11.2026 Москва Анна 12500.5
1 03.11.2026 Казань Олег 8300.0
2 04.11.2026 Москва Иван NaN
Параметр decimal="," превратил «12 500,50» в число 12500.5, thousands=" " убрал пробел между разрядами. Пустая ячейка у Ивана стала NaN, так pandas обозначает пропуск. Все параметры функции описаны в справке по read_csv.
Файлы Excel читаются похоже: pd.read_excel("отчёт.xlsx", sheet_name="Итог"). Без пакета openpyxl функция не сработает, об этой ошибке ниже. Если файл не открывается и в самом Excel, сначала разберитесь с ним по инструкции, как открыть файл Эксель.
Первый осмотр: head, info и describe

Прежде чем что-то считать, посмотрите, что вообще загрузилось. На это есть три метода.
head(n)показывает первые n строк, по умолчанию пять.tail(n)показывает последние.info()выводит число строк, названия и типы столбцов и сколько в каждом заполненных значений.describe()считает сводную статистику по числовым столбцам.
df.info()
<class 'pandas.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 дата 6 non-null str
1 город 6 non-null str
2 менеджер 6 non-null str
3 сумма 5 non-null float64
dtypes: float64(1), str(3)
memory usage: 324.0 bytes
Из вывода сразу видно две вещи. В столбце «сумма» заполнено 5 значений из 6, то есть есть пропуск. А дата прочиталась как строка, считать по ней периоды пока нельзя.
Теперь describe():
print(df.describe())
сумма
count 5.000000
mean 8950.250000
std 3076.782024
min 4150.750000
25% 8300.000000
50% 9900.000000
75% 9900.000000
max 12500.500000
Что означает каждая строка:
- count это число заполненных значений, пропуски не считаются;
- mean это среднее, std это стандартное отклонение;
- min и max дают наименьшее и наибольшее значение;
- 25%, 50%, 75% это квартили, строка 50% совпадает с медианой.
По умолчанию describe берёт только числовые столбцы, поэтому город и менеджер в отчёт не попали. Для текстового столбца метод выдаёт другой набор: count, unique (сколько разных значений), top (самое частое) и freq (сколько раз оно встретилось). Так написано в справке по describe, а увидеть всё сразу можно через df.describe(include="all").
print(df["город"].describe())
print(df["город"].value_counts())
count 6
unique 3
top Казань
freq 3
Name: город, dtype: object
город
Казань 3
Москва 2
Пермь 1
Name: count, dtype: int64
Как выбрать нужные строки и столбцы
Сначала приведём дату к нормальному типу, чтобы дальше с ней можно было работать:
df["дата"] = pd.to_datetime(df["дата"], format="%d.%m.%Y")
print(df["дата"].dtype)
datetime64[us]
Строки по условию отбирают так: в квадратные скобки передают проверку для столбца. Несколько условий соединяют через & (и) или | (или), каждое в своих круглых скобках. Сравнивают обычными операторами Python: ==, >, !=, о последнем есть отдельный разбор «не равно» в Python.
print(df[(df["город"] == "Казань") & (df["сумма"] > 9000)])
дата город менеджер сумма
4 2026-11-05 Казань Анна 9900.0
5 2026-11-05 Казань Анна 9900.0
Кроме скобок есть ещё три способа. Чем они отличаются:
| Способ | Как выбирает | Пример |
|---|---|---|
df["столбец"] |
один столбец по названию | df["сумма"] |
loc[] |
строки и столбцы по подписям или условию | df.loc[df["менеджер"] == "Олег", ["город", "сумма"]] |
iloc[] |
по номерам позиций, как срезы в Python | df.iloc[:2, 1:3] |
query() |
условие строкой, удобно при длинных фильтрах | df.query("город == 'Москва'") |
У iloc правая граница не входит в срез, как и у обычных списков. У loc подписи берутся включительно, на этом часто ошибаются.
print(df.loc[df["менеджер"] == "Олег", ["город", "сумма"]])
print(df.iloc[:2, 1:3])
город сумма
1 Казань 8300.00
3 Пермь 4150.75
город менеджер
0 Москва Анна
1 Казань Олег
Очистка данных: пропуски, дубли и типы
В нашем файле две проблемы: последняя строка повторяет предыдущую, а у Ивана нет суммы. Считаем и убираем дубль:
print(df.duplicated().sum())
df = df.drop_duplicates()
print(df["сумма"].isna().sum())
1
1
С пропуском сложнее. Его можно удалить через dropna() или заполнить через fillna(), и выбор меняет результат. Вот среднее по тем же пяти суммам с пропуском и после замены пропуска нулём:
s = pd.Series([12500.5, 8300.0, None, 4150.75, 9900.0])
print(round(s.mean(), 2), round(s.fillna(0).mean(), 2))
8712.81 6970.25
При подсчёте среднего pandas не учитывает пропуск, а ноль учитывает как обычное число. Замена пропуска нулём занизила среднее на 20%. Ноль ставят, только когда он и правда означает «продаж не было». Если сумму просто не внесли, строку лучше исключить или пометить. Похожая логика есть в базах данных, о ней наша статья про NULL в SQL.
Третья частая проблема связана с типами. Если число прочиталось как текст, его переводят через astype(float), дату через pd.to_datetime(), как мы сделали выше.
Группировка, сводные таблицы и объединение
Ради этих операций pandas чаще всего и открывают. Для примеров ниже пропуск у Ивана заполнен нулём, поэтому в итогах у него 0:
df["сумма"] = df["сумма"].fillna(0)
Итоги по группам через groupby
Метод groupby() делит таблицу на группы по значению столбца и считает по каждой итог. Это аналог GROUP BY в базах данных, а сам подсчёт похож на функцию COUNT в SQL.
print(df.groupby("менеджер").agg(заказов=("сумма", "count"), выручка=("сумма", "sum")))
заказов выручка
менеджер
Анна 2 22400.50
Иван 1 0.00
Олег 2 12450.75
Сводная таблица через pivot_table
Сводная таблица раскладывает итоги сразу по двум осям, как в Excel: города в строках, менеджеры в столбцах.
print(df.pivot_table(index="город", columns="менеджер", values="сумма",
aggfunc="sum", fill_value=0))
менеджер Анна Иван Олег
город
Казань 9900.0 0.0 8300.00
Москва 12500.5 0.0 0.00
Пермь 0.0 0.0 4150.75
Соединение таблиц через merge
Допустим, план продаж по городам лежит в другой таблице. merge() соединяет их по общему столбцу, как JOIN в SQL. Параметр how="left" оставляет все строки левой таблицы, даже если пары для них не нашлось.
plan = pd.DataFrame({"город": ["Москва", "Казань", "Пермь"], "план": [20000, 15000, 5000]})
fact = df.groupby("город", as_index=False)["сумма"].sum()
res = fact.merge(plan, on="город", how="left")
res["выполнение"] = (res["сумма"] / res["план"] * 100).round(1)
print(res.sort_values("выполнение", ascending=False))
город сумма план выполнение
0 Казань 18200.00 15000 121.3
2 Пермь 4150.75 5000 83.0
1 Москва 12500.50 20000 62.5
Итоги по дням через resample
Когда столбец с датой имеет тип datetime64, по нему можно фильтровать периоды и считать итоги по дням, неделям или месяцам. Строки с 4 ноября и позже отбираются обычным сравнением:
print(df[df["дата"] >= "2026-11-04"])
дата город менеджер сумма
2 2026-11-04 Москва Иван 0.00
3 2026-11-04 Пермь Олег 4150.75
4 2026-11-05 Казань Анна 9900.00
Метод resample() группирует строки по календарным периодам. Дату для этого переносят в индекс:
print(df.set_index("дата").resample("D")["сумма"].sum())
дата
2026-11-03 20800.50
2026-11-04 4150.75
2026-11-05 9900.00
Freq: D, Name: сумма, dtype: float64
Код "D" означает день. Для недели пишут "W", для месяца "ME". Отдельные части даты достаются через .dt: df["дата"].dt.day вернёт число месяца, dt.month вернёт номер месяца.
Чтобы просто поставить одну таблицу под другой, например выгрузки за два месяца, берут pd.concat([янв, фев]). Сохранить результат с теми же разделителями, что были во входном файле, можно так: res.to_csv("итог.csv", index=False, sep=";", decimal=",").
Если файл не помещается в память
Pandas загружает всю таблицу в оперативную память. С выгрузкой на несколько гигабайт помогают три приёма из раздела документации о больших данных:
- читать только нужные столбцы через
usecols; - хранить повторяющиеся значения вроде городов в типе
category; - читать файл частями через
chunksizeи складывать итоги.
opts = dict(encoding="cp1251", sep=";", decimal=",", thousands=" ")
df = pd.read_csv("sales.csv", usecols=["город", "сумма"], **opts)
print(df.columns.tolist())
total = 0
for part in pd.read_csv("sales.csv", chunksize=2, **opts):
total += part["сумма"].sum()
print(total)
['город', 'сумма']
44751.25
Здесь файл прочитан по две строки за раз, а сумма посчитана по сырым данным вместе с дублем. Если и частями выходит долго, данные обычно переносят в базу и считают там запросом SQL.
Что изменилось в pandas 3.0
Версия 3.0.0 вышла 21 января 2026 года и поменяла поведение, на которое опирался код под старые версии. Главное из списка изменений 3.0:
- Текст хранится в типе
str, а неobject. В такой столбец нельзя положить число. Если установлен пакет PyArrow, строки хранятся через него, если нет, pandas работает без него. - Любая выборка ведёт себя как копия. Этот режим называется Copy-on-Write. Предупреждение
SettingWithCopyWarningубрали, защитные вызовы.copy()больше не нужны. - Цепочка присваиваний перестала работать. Запись вида
df[условие]["столбец"] = значениене меняет исходную таблицу. - Даты из строк по умолчанию читаются с точностью до микросекунд, отсюда
datetime64[us]в примере выше. Раньше былоdatetime64[ns]. - Появилась функция
pd.col(), через неё можно ссылаться на столбец по имени внутри выражений. - Минимальная версия Python теперь 3.11.
Цепочку присваиваний стоит разобрать на примере, на ней чаще всего ломается старый код. Хотим обнулить сумму в Перми:
df[df["город"] == "Пермь"]["сумма"] = 0
ChainedAssignmentError: A value is being set on a copy of a DataFrame or Series through chained assignment.
Such chained assignment never works to update the original DataFrame or Series, because the intermediate object on which we are setting values always behaves as a copy (due to Copy-on-Write).
Try using '.loc[row_indexer, col_indexer] = value' instead, to perform the assignment in a single step.
Программа не упадёт, это только предупреждение. Но и в таблице ничего не изменится. Правильно присваивать одним шагом через loc:
df.loc[df["город"] == "Пермь", "сумма"] = 0
Как переписать старый код под новые правила, подробно объясняет руководство по переходу на pandas 3.
Частые ошибки и что с ними делать

UnicodeDecodeError при чтении CSV
Файл сохранён не в UTF-8. Решение: передать encoding="cp1251" для файлов из старых русских программ или encoding="utf-8-sig", если в начале файла есть служебная метка BOM. Все кодировки, которые понимает Python, с их другими названиями собраны в таблице стандартных кодировок: cp1251 там же значится как windows-1251.
Вся таблица в одном столбце
В df.columns одна длинная строка с точками с запятой внутри. Решение: указать sep=";", а для дробных чисел ещё decimal=",".
KeyError при обращении к столбцу
Столбец точно есть, а pandas пишет KeyError: 'сумма'. Чаще всего в заголовке файла остался пробел:
d2 = pd.DataFrame({"сумма ": [1, 2]})
print(d2.columns.tolist())
d2.columns = d2.columns.str.strip()
print(d2.columns.tolist())
['сумма ']
['сумма']
Метод str.strip() убирает пробелы по краям сразу у всех названий. Другие полезные приёмы со строками есть в шпаргалке по методам строк.
Сумма склеилась в строку
Вместо числа sum() вернул что-то вроде 12 500,508 300,00. Значит, столбец прочитался как текст и pandas склеил строки. Решение: при чтении указать decimal и thousands или почистить столбец вручную:
t = pd.DataFrame({"сумма": ["12 500,50", "8 300,00"]})
print(t["сумма"].sum())
print(t["сумма"].str.replace(" ", "").str.replace(",", ".").astype(float).sum())
12 500,508 300,00
20800.5
ModuleNotFoundError: No module named ‘openpyxl’
Такую ошибку выдают to_excel() и read_excel(), если не установлен движок для файлов xlsx. Решение: pip install openpyxl в том же окружении, где стоит pandas.
ValueError: Invalid frequency: M
Код из старых примеров считает итоги по месяцам через resample("M"), а pandas 3.1 отвечает ошибкой и сам подсказывает замену. Решение: писать "ME" для конца месяца, "QE" для квартала и "YE" для года.
TypeError при записи числа в текстовый столбец
В pandas 3.0 и новее столбец типа str принимает только строки и пропуски:
df.loc[0, "город"] = 77
TypeError: Invalid value '77' for dtype 'str'. Value should be a string or missing value, got 'int' instead.
Решение: передать значение строкой ("77") или заранее перевести столбец в нужный тип через astype(). Если ошибку нужно поймать и обработать в программе, поможет конструкция try except.
Excel, SQL или NumPy: что выбрать под задачу
Pandas не заменяет все инструменты сразу. Ориентир такой:
| Инструмент | Когда подходит лучше |
|---|---|
| Excel или Google Таблицы | разовый отчёт на несколько тысяч строк, правки руками, таблица для коллег без Python |
| SQL | данные лежат в базе, нужно отобрать и посчитать их до выгрузки |
| NumPy | однородные числовые массивы и матрицы, вычисления без подписей строк и столбцов |
| Pandas | повторяемая обработка выгрузок, очистка, соединение таблиц из разных источников, подготовка данных для графиков и моделей |
В работе их обычно сочетают. Аналитик отбирает данные запросом SQL, дочищает и сводит в pandas, а результат отдаёт в Excel. Такой набор навыков описан в нашем обзоре профессии аналитик данных, а задачи на pandas встречаются и на собеседовании аналитика.
Где освоить pandas системно
Методов из этой статьи хватит, чтобы разобрать первую выгрузку. Дальше идут временные ряды, графики, работа с большими файлами и связка с SQL, и это удобнее проходить по программе с заданиями и проверкой кода. Pandas входит почти во все курсы по анализу данных и Data Science.
Ниже курсы из каталога курсов по pandas с ценами и программами:
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Data Scientist PRO» Перейти на сайт курса | 224 595 ₽ | 7245 ₽/мес. | 12 месяцев | Обзор курса | |
| Аналитик данных с нуля Перейти на сайт курса | 126 936 ₽ | 4994 ₽/мес. | 4 месяца | Обзор курса | |
| Профессия «Аналитик данных с нуля до middle» Перейти на сайт курса | 145 600 ₽ | 6066 ₽/мес. | 12 месяцев | Обзор курса | |
| Data Scientist Перейти на сайт курса | 109 900 ₽ | 4579 ₽/мес. | 9 месяцев | Обзор курса | |
| Аналитик данных Перейти на сайт курса | 131 814 ₽ | 3662 ₽/мес. | 6 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Pandas




