Введение

Зачем нужна библиотека Pandas

Когда данные выглядят как таблица - строки, столбцы, заголовки, числа и текст в ячейках - писать обработку вручную циклами неудобно и медленно. Библиотека Pandas даёт готовые структуры и операции для таких данных: загрузка из CSV и Excel, фильтрация, группировка, агрегация и запись обратно в файл.

Pandas особенно востребован в аналитике, подготовке датасетов для машинного обучения и быстрых отчётах. Его базовые объекты - DataFrame (таблица) и Series (один столбец). Работа с ними похожа на работу с таблицами в Excel, но всё делается кодом и легко автоматизируется.

На этом уроке мы разберём установку, чтение и запись данных, выбор строк и столбцов, обработку пропусков и простую группировку. Этого достаточно, чтобы уверенно готовить табличные данные к анализу или к передаче в NumPy и моделям.

Александр
Здорово отдельный урок по таблицам - в прошлый раз только мельком упоминали.
Основы

DataFrame и Series - два главных метода

DataFrame - это таблица: строки и столбцы с возможными именами. Каждый столбец может иметь свой тип (числа, строки, даты). Строки часто нумеруются с нуля, но можно задать свой индекс - например, идентификатор или дату.

Series - это один столбец или одна строка: по сути упорядоченный набор значений с общим индексом. Когда ты выбираешь из DataFrame один столбец, получаешь именно Series. Операции вроде среднего, суммы или фильтрации работают и для Series, и для целой таблицы.

Понимание разницы помогает не путаться: таблица - это DataFrame, столбец - Series. Большинство повседневных задач решаются комбинацией операций над этими объектами.

Установка

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

Pandas не входит в стандартную библиотеку Python. Его ставят через pip: pip install pandas. В проекте лучше использовать виртуальное окружение, чтобы версии не конфликтовали с другими заданиями.

В коде библиотеку импортируют обычно так: import pandas as pd. Сокращение pd - общепринятый стандарт, его же используют в документации и примерах. Дальше все вызовы идут через pd.read_csv(), pd.DataFrame() и т.д.

Мария
А если уже ставил pandas в уроке про библиотеки - нужно заново?
Дмитрий
Не нужно. Если пакет уже в окружении, просто импортируй и работай.
Чтение данных

Чтение CSV - read_csv

Один из самых частых сценариев - загрузить таблицу из CSV-файла. Функция pd.read_csv('имя_файла.csv') возвращает DataFrame. Первая строка файла по умолчанию считается заголовком (имена столбцов). Разделитель - запятая; если в файле точка с запятой, можно указать sep=';'.

Дополнительные полезные параметры: encoding='utf-8' для корректной кириллицы, header=0 или None если заголовка нет, index_col=0 чтобы первый столбец стал индексом строк. Результат - полноценный DataFrame, с которым можно работать дальше.

Живой пример - что возвращает read_csv
Структура

Строки, столбцы и индекс

У DataFrame есть атрибуты, которые помогают ориентироваться в данных. df.shape - кортеж (число строк, число столбцов). df.columns - имена столбцов, df.index - метки строк (по умолчанию 0, 1, 2, ...). Типы столбцов можно посмотреть через df.dtypes.

Чтобы быстро оценить содержимое, используют df.head() - первые пять строк, и df.tail() - последние пять. В скобках можно указать другое число, например df.head(10). Это не меняет сам DataFrame, а только показывает срез.

Выбор данных

Выбор столбца и нескольких столбцов

Один столбец выбирают так: df['имя_столбца']. Результат - Series. Если имя столбца без пробелов и спецсимволов, можно и так: df.имя_столбца, но вариант в кавычках универсальнее.

Несколько столбцов - передаём список: df[['столбец_A', 'столбец_B']]. Обратите внимание на двойные скобки: внешние - обращение к DataFrame, внутренние - список имён. В результате снова DataFrame с выбранными столбцами.

Важно: один столбец - одна пара квадратных скобок и получается Series; несколько столбцов - список в скобках и получается DataFrame.

Выбор по строкам

loc и iloc - выбор по меткам и по позиции

loc - доступ по меткам индекса и именам столбцов. Например, df.loc[0, 'цена'] - значение в строке с меткой 0 и столбце «цена». Срез строк: df.loc[0:5, ['имя', 'цена']] - строки с метками от 0 до 5 включительно и два столбца.

iloc - доступ по целочисленной позиции (как в массиве). df.iloc[0, 1] - первая строка, второй столбец. df.iloc[:10, :3] - первые 10 строк и первые 3 столбца. Для быстрого среза «первые N строк» часто пишут просто df.iloc[:N].

Ольга
То есть loc - по смыслу (названия), iloc - по номеру?
Дмитрий
Да. loc - по метке индекса и имени столбца, iloc - строго по позиции 0, 1, 2...
Фильтрация

Фильтрация по условию (boolean indexing)

Часто нужно оставить только те строки, где значение в столбце удовлетворяет условию. Для этого строят булев массив: df['цена'] > 100 даёт Series из True/False по каждой строке. Затем его передают в скобки: df[df['цена'] > 100] - получаем только строки с ценой больше 100.

Условия можно комбинировать: df[(df['город'] == 'Москва') & (df['сумма'] >= 500)]. Важно использовать скобки вокруг каждого сравнения и операторы & (и), | (или), а не слова and/or. Так Pandas обрабатывает целые столбцы за один проход.

Живой пример - фильтр по столбцу
Пропуски

Пропущенные значения - isna, fillna, dropna

В реальных данных часто встречаются пропуски. В Pandas они представлены как NaN (Not a Number для чисел) или None. Проверить, где пропуски, можно через df.isna() - получится таблица True/False. По столбцу: df['столбец'].isna(); посчитать количество: df['столбец'].isna().sum().

Два основных подхода к обработке: заменить пропуски значением - df.fillna(0) или df['столбец'].fillna(df['столбец'].mean()); либо удалить строки с пропусками - df.dropna() (все строки, где есть хотя бы один NaN) или df.dropna(subset=['столбец']) только по указанным столбцам.

Группировка

Группировка - groupby

Когда нужно посчитать что-то по группам (например, среднюю цену по каждому городу или сумму продаж по категориям), используют groupby. Синтаксис: df.groupby('столбец_группы'). После этого к результату применяют агрегирующую функцию.

Примеры: df.groupby('город')['сумма'].mean() - средняя сумма по каждому городу; df.groupby('категория').size() - количество строк в каждой категории; df.groupby('дата').agg({'цена': 'mean', 'количество': 'sum'}) - разные агрегаты по разным столбцам. groupby не меняет исходный DataFrame, он возвращает новый объект с сгруппированными результатами.

Агрегация

Сумма, среднее, количество - sum, mean, count

По одному столбцу или по всей таблице можно быстро посчитать: df['столбец'].sum(), df['столбец'].mean(), df['столбец'].count() (число непустых значений), df['столбец'].min(), df['столбец'].max(). Для целого DataFrame df.mean() вернёт среднее по каждому числовому столбцу.

В связке с groupby эти же функции дают итоги по группам. Дополнительно полезны agg() или aggregate() - в них можно передать список функций или словарь «столбец - функция», чтобы получить несколько показателей сразу.

Живой пример - groupby и mean
Сортировка

Сортировка - sort_values

Упорядочить строки по значениям одного или нескольких столбцов можно через df.sort_values('столбец'). По умолчанию порядок возрастающий. Для убывания: df.sort_values('столбец', ascending=False). Несколько столбцов: df.sort_values(['город', 'сумма'], ascending=[True, False]) - сначала по городу по возрастанию, затем по сумме по убыванию.

Метод возвращает новый DataFrame (исходный не меняется, если не указать inplace=True). После сортировки индекс остаётся «рваным» - номера строк не пересчитываются автоматически; при необходимости можно вызвать df.reset_index(drop=True).

Запись

Запись в CSV - to_csv

Сохранить DataFrame в CSV можно методом df.to_csv('имя_файла.csv'). По умолчанию записываются и индекс, и заголовки. Часто индекс в файл не нужен - тогда df.to_csv('файл.csv', index=False). Для кириллицы можно указать encoding='utf-8' или encoding='utf-8-sig' (с BOM для Excel).

Разделитель по умолчанию - запятая; при необходимости задаётся параметром sep. Метод не возвращает таблицу, а только пишет файл. Проверить результат можно, открыв файл или загрузив его снова через read_csv.

Александр
То есть цикл: read_csv - обработка - to_csv. Классика.
Связка с NumPy

Pandas и NumPy - переход к массивам

Под капотом Pandas часто использует NumPy. Получить из DataFrame или Series «голый» массив можно через .values (устаревает) или предпочтительно .to_numpy(). Например, df[['x', 'y']].to_numpy() даёт двумерный массив чисел - его уже можно передать в модель или в функции NumPy.

Типичный сценарий для машинного обучения: загрузить таблицу через read_csv, выбрать нужные столбцы, обработать пропуски, при необходимости нормализовать, затем .to_numpy() и дальше - в NumPy или в тензоры PyTorch. Pandas отвечает за табличную логику, NumPy - за численные операции.

Создание таблицы

DataFrame из словаря и списков

Не только чтение из файла: DataFrame можно собрать в коде. Из словаря, где ключи - имена столбцов, значения - списки: pd.DataFrame({'имя': ['Анна', 'Борис'], 'балл': [85, 92]}). Длины списков должны совпадать. Из списка списков с указанием столбцов: pd.DataFrame([[1, 'a'], [2, 'b']], columns=['число', 'буква']).

Series создаётся из одного списка: pd.Series([10, 20, 30], name='значения'). Это удобно для быстрых экспериментов и тестовых данных без отдельного файла.

Практические советы

Типичные ошибки и как их избежать

Путаница с одной и двумя скобками: df['A'] - столбец, Series; df[['A']] - DataFrame из одного столбца. При фильтрации условие должно быть Series булевых значений той же длины - не список и не одно значение.

Изменения по умолчанию не применяются «на месте». Почти все методы возвращают новый объект; если нужно изменить существующий, либо присваивайте результат (df = df.dropna()), либо используйте inplace=True там, где он есть. При сохранении в CSV метод to_csv() по умолчанию записывает индекс строк как отдельный столбец — чтобы в файле не было лишнего столбца с номерами строк, передавайте index=False. И ещё: проверяйте кодировку при чтении русскоязычных CSV - иначе кракозябры.

Мария
Один раз полчаса искала ошибку - оказалось, забыла index=False в to_csv и в файле лишний столбец.
Дмитрий
Да, с index=False привыкай сразу - так чище.
Итог теории

Что вынести из урока перед практикой

Pandas - библиотека для табличных данных: загрузка CSV, выбор столбцов и строк (в том числе loc/iloc), фильтрация по условию, обработка пропусков (fillna, dropna), группировка (groupby) и агрегация (mean, sum, count), сортировка (sort_values), запись в CSV (to_csv). Два главных типа - DataFrame (таблица) и Series (столбец). Связка с NumPy - метод .to_numpy() для передачи данных в модели.

Минимум для уверенного старта: уметь прочитать CSV, посмотреть head и shape, выбрать столбец или отфильтровать строки, при необходимости сгруппировать и посчитать среднее или сумму, сохранить результат в файл.

Ольга
Готова к заданиям. Хочу проверить, что запомнила про groupby и фильтры.

Интерактив 1 - сопоставьте метод и задачу

Сопоставьте операцию Pandas и её назначение

read_csv
fillna
groupby
to_csv
df[df['col'] > 0]

Выберите верные утверждения

Интерактив 2 - порядок шагов и выбор

Расставьте шаги обработки таблицы по порядку

Загрузить CSV через read_csv
Посмотреть head() или shape
Отфильтровать или обработать пропуски
Сгруппировать и посчитать агрегаты (если нужно)
Сохранить результат в to_csv

Что вернёт выражение df['цена']?

Как удалить строки с пропусками в столбце 'A'?

Интерактив 3 - вставьте правильные фрагменты

Выберите подходящие конструкции для типичного сценария Pandas.

import pandas as df = pd.('data.csv') print(df.()) subset = df[df['цена'] 100] subset.('result.csv', index=False)

Что обязательно должно быть в скрипте с Pandas? Выберите несколько.

Финальный допуск

Ответьте минимум на 8 из 10 вопросов правильно, чтобы открыть практику.

1. Что возвращает pd.read_csv('file.csv')?

2. Что такое Series в Pandas?

3. Как выбрать один столбец по имени?

4. Чем отличается loc от iloc?

5. Как отфильтровать строки, где столбец 'цена' больше 50?

6. Для чего нужен groupby?

7. Как сохранить DataFrame в CSV без индекса?

8. Что делает fillna(0)?

9. Как получить из DataFrame массив NumPy?

10. Стандартный импорт Pandas в коде?

Практика - обработка таблицы с Pandas

Подготовьте файл pandas_task.py и загрузите его на проверку. Цель - показать, что вы умеете загружать данные, выполнять операции и при необходимости сохранять результат.

  • Импортируйте pandas as pd.
  • Создайте DataFrame из словаря или списков (минимум 2 столбца, 3 строки) либо используйте pd.read_csv() с путём к файлу - для проверки достаточно создать таблицу в коде через pd.DataFrame(...).
  • Выведите первые строки таблицы (head) или shape.
  • Выполните хотя бы одну операцию: выбор столбца, фильтрация по условию, groupby с агрегатом (mean/sum/count), sort_values или обработка пропусков (fillna/dropna).
  • Выведите результат операции через print() или сохраните в CSV через to_csv.
  • Добавьте краткий комментарий в коде о том, что делает ваш скрипт (например: загрузка, фильтр, группировка).
Порог зачёта - 60 баллов. Проверка смотрит на наличие импорта pandas, создание или чтение DataFrame, операцию над данными и вывод/запись результата.
import pandas as pd # Создаём таблицу для примера df = pd.DataFrame({ 'город': ['Москва', 'Казань', 'Москва', 'Казань'], 'сумма': [100, 150, 200, 120] }) print(df.head()) # Группировка: средняя сумма по городу by_city = df.groupby('город')['сумма'].mean() print(by_city) # Сохраняем результат (опционально) # by_city.to_csv('result.csv')

Загрузите файл Python для проверки