pandas: таблицы как DataFrame
pandas — это Excel внутри Python. Таблица превращается в объект DataFrame, который умеет фильтровать, группировать и считать сводки парой строк кода.
Суть:pd.read_csv/pd.read_excelзагружают таблицу в DataFrame. Дальше — фильтрация булевой маской и агрегаты черезgroupby.
Когда таблица большая, а расчёты сложнее простого суммирования, ручной цикл по строкам становится громоздким. pandas — это библиотека для работы с таблицами целиком. Её центральный объект — DataFrame: таблица со строками и именованными колонками, над которой можно выполнять операции сразу над всем столбцом.
Загрузка данных — одна строка: pd.read_csv('sales.csv') или pd.read_excel('sales.xlsx'). Дальше работают три кита pandas: выбор колонок, фильтрация строк по условию и группировка с агрегатом. Поскольку pandas нет в браузере, его код пойдёт во врезках language-text.
import pandas as pd
# Загрузка таблицы в DataFrame
df = pd.read_csv('sales.csv') # или pd.read_excel('sales.xlsx')
# Фильтрация: только продажи больше 1000
big = df[df['sales'] > 1000]
# Группировка: сумма продаж по городам
by_city = df.groupby('city')['sales'].sum().sort_values(ascending=False)
print(by_city)
# Новая колонка на основе существующих
df['with_vat'] = df['sales'] * 1.2Чтобы прочувствовать логику группировки без pandas, воспроизведём то, что делает groupby('city')['sales'].sum(), на чистом stdlib. Это исполнимо в браузере и показывает, что под капотом pandas — та же группировка по ключу.
Попробуй сам ▶
from collections import defaultdict
# Те же данные, что были бы в DataFrame
rows = [
{'city': 'Москва', 'sales': 1200},
{'city': 'Казань', 'sales': 800},
{'city': 'Москва', 'sales': 1500},
{'city': 'Казань', 'sales': 1100},
]
# Аналог df.groupby('city')['sales'].sum()
totals = defaultdict(int)
for r in rows:
totals[r['city']] += r['sales']
for city, total in sorted(totals.items(), key=lambda x: -x[1]):
print(f'{city:8} {total}')
# pandas делает ровно это, но над целым столбцом и быстрееDATAFRAME: ОПЕРАЦИИ
read_csv -> DataFrame (строки x колонки)
|
+-----------+-----------+
v v v
выбрать фильтр groupby
колонку по маске + сумма
| | |
+-----------+-----------+
v
to_excel / to_csvОтдельная сила pandas — обработка пропусков и грязных данных, неизбежных в реальных таблицах. Метод dropna() убирает строки с пустыми ячейками, fillna(0) заполняет их значением по умолчанию, а df['col'].astype(int) приводит колонку к нужному типу. Реальные данные почти всегда приходят с дырами и опечатками, и именно эти методы превращают сырую выгрузку в пригодную для расчётов таблицу. Поэтому в типичном скрипте после read_csv идёт небольшой блок очистки, и лишь затем — собственно анализ. Пропустить этот этап — значит рано или поздно получить загадочную ошибку в середине расчёта.
Как работает под капотом
DataFrame хранит каждую колонку как массив одного типа (поверх numpy). Поэтому операция df['sales'] * 1.2 применяется ко всему столбцу разом, на уровне быстрого C-кода, а не питоновским циклом. Это называется векторизацией и даёт огромный выигрыш в скорости на больших таблицах.
Фильтрация df[df['sales'] > 1000] работает в два шага: сначала df['sales'] > 1000 создаёт булеву маску (столбец из True/False), затем df[маска] оставляет только строки, где True. Понимание этого механизма — ключ к pandas.
Частые ошибки
- Цикл for по строкам DataFrame. Это медленно и не в духе pandas. Используйте векторные операции.
- Путать
=и копию.df2 = dfне копирует данные — это та же таблица. Для копии нуженdf.copy(). - Игнорировать типы при чтении. Колонка с числами может прочитаться как текст; проверяйте
df.dtypes.
Best practices
- Думайте столбцами, а не строками: почти всё в pandas делается векторно.
- Цепочки операций
df.groupby(...).sum().sort_values()читаются как предложение — пользуйтесь ими. - Для разовых правок применяйте
.copy(), чтобы не менять исходный DataFrame неожиданно.
Итоги. pandas превращает таблицу в DataFrame и даёт векторные фильтры и группировки. Под капотом — булевы маски и операции над целыми столбцами. Дальше углубимся в Excel: оформление и формулы через openpyxl.