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.

Проверьте себя
1. Как pandas выполняет df[df['sales'] > 1000]?
AПеребирает строки циклом for
BСоздаёт булеву маску и оставляет строки, где True
CСортирует таблицу по колонке sales
DУдаляет колонку sales
2. Почему df['sales'] * 1.2 быстрее питоновского цикла?
Apandas использует несколько процессоров
BОперация векторизована и выполняется над всем столбцом на уровне C
CУмножение в Python всегда быстрое
Dpandas кэширует результат