- NumPy хранит числа в массивах и считает над всем массивом сразу, pandas работает с таблицами.
- Столбец таблицы pandas опирается на массив NumPy, поэтому библиотеки обычно используют вместе.
- Пропуски в данных обозначаются NaN: среднее по столбцу считается без них, но их нужно заметить.
- Для небольших таблиц хватит обычного Python; библиотеки окупаются, когда данных много или операций много.
Содержание10 разделов ▾
NumPy — библиотека Python для вычислений над массивами чисел, а pandas — библиотека для работы с таблицами; pandas построен на NumPy, поэтому их обычно используют вместе. Статья для тех, кто знает в Python списки, словари и циклы. Вы посчитаете сводку по небольшой таблице тремя способами: обычным Python, NumPy и pandas.
Определения взяты из документации NumPy и pandas. Код проверен запуском в чистом виртуальном окружении: Python 3.13.12, NumPy 2.5.3, pandas 3.0.6. Данные на октябрь 2026 года.
Зачем нужны NumPy и pandas
Возьмём учебную задачу: в таблице десять оценок пяти учеников по двум предметам, у одной оценки пропуск. Нужно найти среднее и максимум по предметам. Обычным Python это пишется так:
import statistics
оценки = [
("Анна", "математика", 5), ("Анна", "физика", 4),
("Борис", "математика", 3), ("Борис", "физика", 4),
("Вера", "математика", 5), ("Вера", "физика", 5),
("Глеб", "математика", 4), ("Глеб", "физика", 2),
("Дарья", "математика", 4), ("Дарья", "физика", None),
]
по_предметам = {}
for имя, предмет, балл in оценки:
if балл is not None: # пропуск приходится обрабатывать вручную
по_предметам.setdefault(предмет, []).append(балл)
for предмет, баллы in по_предметам.items():
print(предмет, "среднее:", statistics.mean(баллы), "максимум:", max(баллы), "оценок:", len(баллы))математика среднее: 4.2 максимум: 5 оценок: 5
физика среднее: 4 максимум: 5 оценок: 4Данные в этом примере придуманы для обучения, это не результаты реальных учеников. Код работает, но для каждой новой операции придётся писать свой цикл. Библиотеки берут это на себя.
Установка и проверка
Документация pandas описывает установку через pip из PyPI: pip install pandas. Для NumPy на странице установки перечислены несколько способов, в том числе pip. Обычно ставят оба пакета одной командой, лучше внутри виртуального окружения:
pip install numpy pandasПроверка, что всё работает:
import numpy as np
import pandas as pd
print(np.__version__, pd.__version__)2.5.3 3.0.6У вас версии могут быть другими. По данным PyPI, pandas 3.0.6 требует Python 3.11 или новее (на октябрь 2026 года).
NumPy: массивы и операции
Документация NumPy описывает ndarray как однородный многомерный массив. Однородный значит, что все элементы одного типа.
import numpy as np
цены = [120, 80, 45, 200]
а = np.array(цены)
print(а, а.dtype, а.shape)
print(а * 2)
print(а * 1.2)
print(а.mean(), а.max(), а.sum())
print(а[а > 100])[120 80 45 200] int64 (4,)
[240 160 90 400]
[144. 96. 54. 240.]
111.25 200 445
[120 200]Что здесь видно. Умножение массива на число применяется ко всем элементам сразу: это векторная операция. Документация NumPy называет отсутствие явных циклов векторизацией и отмечает, что такой код короче и ближе к математической записи. Запись а[а > 100] — фильтр: в массив попадают только элементы, для которых условие истинно.
Двумерный массив и операции по осям:
m = np.array([[1, 2, 3], [4, 5, 6]])
print(m.shape, m[1, 2], m[:, 0])
print(m.mean(axis=0), m.mean(axis=1))(2, 3) 6 [1 4]
[2.5 3.5 4.5] [2. 5.]axis=0 считает по столбцам, axis=1 — по строкам.
| Действие | Список Python | Массив NumPy |
|---|---|---|
| Умножить все элементы на 2 | [x * 2 for x in цены] | а * 2 |
[1, 2] * 2 | [1, 2, 1, 2] (повторение) | np.array([1, 2]) * 2 даёт [2 4] |
| Типы элементов | Любые | Один тип на весь массив |
Различие в строке про * 2 — частая ловушка: у списка умножение повторяет его, у массива — умножает каждый элемент.
pandas: Series и DataFrame
Документация pandas выделяет два основных типа: Series — одномерный массив с метками, DataFrame — двумерная структура, похожая на таблицу со строками и столбцами. Считаем ту же таблицу оценок. Данные для примера читаем прямо из текста через io.StringIO, как будто это файл CSV:
import io
import pandas as pd
данные = """имя,предмет,балл
Анна,математика,5
Анна,физика,4
Борис,математика,3
Борис,физика,4
Вера,математика,5
Вера,физика,5
Глеб,математика,4
Глеб,физика,2
Дарья,математика,4
Дарья,физика,
"""
таблица = pd.read_csv(io.StringIO(данные))
print(таблица.head(3))
таблица.info() имя предмет балл
0 Анна математика 5.0
1 Анна физика 4.0
2 Борис математика 3.0
<class 'pandas.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 имя 10 non-null str
1 предмет 10 non-null str
2 балл 9 non-null float64
dtypes: float64(1), str(2)
memory usage: 372.0 byteshead показывает первые строки, info — структуру: число строк, названия и типы столбцов. Видно, что в столбце балл девять значений из десяти, а тип стал float64: из-за пропуска pandas хранит оценки как дробные числа. Названия типов и строка memory usage зависят от версии pandas.
Сводка и группировка
Те же расчёты, что мы делали циклами, в pandas занимают две строки:
print(таблица["балл"].mean())
print(таблица.groupby("предмет")["балл"].agg(["mean", "max", "count"]))4.0
mean max count
предмет
математика 4.20 5.0 5
физика 3.75 5.0 4Среднее по столбцу pandas считает без пропусков: девять оценок, итог 4,0. Результат по группам совпал с нашим расчётом на чистом Python: математика 4,2, физика 3,75, оценок пять и четыре.
Фильтр строк и подсчёт пропусков:
print(таблица[таблица["балл"] >= 5])
print(таблица["балл"].isna().sum()) имя предмет балл
0 Анна математика 5.0
4 Вера математика 5.0
5 Вера физика 5.0
1Сводную статистику по столбцу даёт describe():
print(таблица.describe()) балл
count 9.0
mean 4.0
std 1.0
min 2.0
25% 4.0
50% 4.0
75% 5.0
max 5.0Как связаны NumPy и pandas
Столбец DataFrame можно превратить в массив NumPy методом to_numpy():
print(type(таблица["балл"].to_numpy()), таблица["балл"].dtype)<class 'numpy.ndarray'> float64Это и есть связь: pandas хранит числа в массивах NumPy и добавляет к ним метки, пропуски и операции над таблицами.
| Задача | Где решать |
|---|---|
| Математика над числами, матрицы | NumPy |
| Таблица с названиями столбцов, разные типы | pandas |
| Чтение CSV и Excel, группировка | pandas |
| Фильтр и сводка по таблице | pandas |
Для построения графиков обычно используют библиотеку matplotlib. В этой статье её нет; начните с документации pandas и matplotlib.
Когда хватает обычного Python
Библиотеки не нужны всегда. Для таблицы из десяти строк мы справились и без них.
| Задача | Чем обойтись |
|---|---|
| Прочитать небольшой CSV и пройти по строкам | модуль csv из стандартной библиотеки |
| Среднее, максимум, медиана по нескольким числам | модуль statistics |
| Много данных, много столбцов, группировки и пропуски | pandas |
| Числовые вычисления над массивами и матрицами | NumPy |
Мы не измеряли скорость, поэтому не называем, во сколько раз библиотеки быстрее. Документация NumPy объясняет выигрыш векторизацией: циклы выполняются в скомпилированном коде. Для своих данных скорость проверяйте замером.
Условия и ограничения
- Версия
- NumPy 2.5.3, pandas 3.0.6 — код запущен в чистом виртуальном окружении с Python 3.13.12; в других версиях вывод
info()и названия типов могут отличаться. - Python
- 3.11 и новее — по данным PyPI на октябрь 2026 года, это требование pandas 3.0.6.
- Данные
- Учебный набор — десять строк придуманы для примера; для реальных файлов используйте свои данные.
- Размер
- Небольшие таблицы — приёмы работы с миллионами строк в статье не разбираются.
- Установка
- Могут быть сложности — при ошибках импорта создайте новое виртуальное окружение и сверьтесь с документацией по установке.
Частые ошибки
- Считают, что
[1, 2] * 2иnp.array([1, 2]) * 2дают одно и то же: список повторяется, массив умножается. - Не замечают пропуски: среднее считается без них, а количество значений меньше, чем строк.
- Не смотрят типы: из-за пропуска целый столбец стал дробным.
- Работают со срезом таблицы, не сделав
.copy(): чтобы менять выборку независимо от исходной таблицы, копируйте её явно. - Перебирают строки таблицы циклом, когда есть векторная операция или
groupby. - Ставят библиотеки в общую среду и ломают её при обновлении, вместо отдельного виртуального окружения.
Короткий вывод
NumPy даёт быстрые массивы чисел, pandas строит на них таблицы с названиями, группировкой и обработкой пропусков. Для маленьких таблиц хватает обычного Python, для реальных данных — нужны библиотеки. Начните с head(), info() и describe(), а в качестве следующего шага учебного маршрута читайте о том, как данные попадают в программу из внешнего сервиса, в статье про API.




