Когда данные выглядят как таблица - строки, столбцы, заголовки, числа и текст в ячейках - писать обработку вручную циклами неудобно и медленно. Библиотека Pandas даёт готовые структуры и операции для таких данных: загрузка из CSV и Excel, фильтрация, группировка, агрегация и запись обратно в файл.
Pandas особенно востребован в аналитике, подготовке датасетов для машинного обучения и быстрых отчётах. Его базовые объекты - DataFrame (таблица) и Series (один столбец). Работа с ними похожа на работу с таблицами в Excel, но всё делается кодом и легко автоматизируется.
На этом уроке мы разберём установку, чтение и запись данных, выбор строк и столбцов, обработку пропусков и простую группировку. Этого достаточно, чтобы уверенно готовить табличные данные к анализу или к передаче в NumPy и моделям.
DataFrame - это таблица: строки и столбцы с возможными именами. Каждый столбец может иметь свой тип (числа, строки, даты). Строки часто нумеруются с нуля, но можно задать свой индекс - например, идентификатор или дату.
Series - это один столбец или одна строка: по сути упорядоченный набор значений с общим индексом. Когда ты выбираешь из DataFrame один столбец, получаешь именно Series. Операции вроде среднего, суммы или фильтрации работают и для Series, и для целой таблицы.
Понимание разницы помогает не путаться: таблица - это DataFrame, столбец - Series. Большинство повседневных задач решаются комбинацией операций над этими объектами.
Pandas не входит в стандартную библиотеку Python. Его ставят через pip: pip install pandas. В проекте лучше использовать виртуальное окружение, чтобы версии не конфликтовали с другими заданиями.
В коде библиотеку импортируют обычно так: import pandas as pd. Сокращение pd - общепринятый стандарт, его же используют в документации и примерах. Дальше все вызовы идут через pd.read_csv(), pd.DataFrame() и т.д.
Один из самых частых сценариев - загрузить таблицу из CSV-файла. Функция pd.read_csv('имя_файла.csv') возвращает DataFrame. Первая строка файла по умолчанию считается заголовком (имена столбцов). Разделитель - запятая; если в файле точка с запятой, можно указать sep=';'.
Дополнительные полезные параметры: encoding='utf-8' для корректной кириллицы, header=0 или None если заголовка нет, index_col=0 чтобы первый столбец стал индексом строк. Результат - полноценный DataFrame, с которым можно работать дальше.
У 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 - доступ по меткам индекса и именам столбцов. Например, 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].
Часто нужно оставить только те строки, где значение в столбце удовлетворяет условию. Для этого строят булев массив: df['цена'] > 100 даёт Series из True/False по каждой строке. Затем его передают в скобки: df[df['цена'] > 100] - получаем только строки с ценой больше 100.
Условия можно комбинировать: df[(df['город'] == 'Москва') & (df['сумма'] >= 500)]. Важно использовать скобки вокруг каждого сравнения и операторы & (и), | (или), а не слова and/or. Так Pandas обрабатывает целые столбцы за один проход.
В реальных данных часто встречаются пропуски. В 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. Синтаксис: df.groupby('столбец_группы'). После этого к результату применяют агрегирующую функцию.
Примеры: df.groupby('город')['сумма'].mean() - средняя сумма по каждому городу; df.groupby('категория').size() - количество строк в каждой категории; df.groupby('дата').agg({'цена': 'mean', 'количество': 'sum'}) - разные агрегаты по разным столбцам. groupby не меняет исходный DataFrame, он возвращает новый объект с сгруппированными результатами.
По одному столбцу или по всей таблице можно быстро посчитать: df['столбец'].sum(), df['столбец'].mean(), df['столбец'].count() (число непустых значений), df['столбец'].min(), df['столбец'].max(). Для целого DataFrame df.mean() вернёт среднее по каждому числовому столбцу.
В связке с groupby эти же функции дают итоги по группам. Дополнительно полезны agg() или aggregate() - в них можно передать список функций или словарь «столбец - функция», чтобы получить несколько показателей сразу.
Упорядочить строки по значениям одного или нескольких столбцов можно через df.sort_values('столбец'). По умолчанию порядок возрастающий. Для убывания: df.sort_values('столбец', ascending=False). Несколько столбцов: df.sort_values(['город', 'сумма'], ascending=[True, False]) - сначала по городу по возрастанию, затем по сумме по убыванию.
Метод возвращает новый DataFrame (исходный не меняется, если не указать inplace=True). После сортировки индекс остаётся «рваным» - номера строк не пересчитываются автоматически; при необходимости можно вызвать df.reset_index(drop=True).
Сохранить DataFrame в CSV можно методом df.to_csv('имя_файла.csv'). По умолчанию записываются и индекс, и заголовки. Часто индекс в файл не нужен - тогда df.to_csv('файл.csv', index=False). Для кириллицы можно указать encoding='utf-8' или encoding='utf-8-sig' (с BOM для Excel).
Разделитель по умолчанию - запятая; при необходимости задаётся параметром sep. Метод не возвращает таблицу, а только пишет файл. Проверить результат можно, открыв файл или загрузив его снова через read_csv.
Под капотом Pandas часто использует NumPy. Получить из DataFrame или Series «голый» массив можно через .values (устаревает) или предпочтительно .to_numpy(). Например, df[['x', 'y']].to_numpy() даёт двумерный массив чисел - его уже можно передать в модель или в функции NumPy.
Типичный сценарий для машинного обучения: загрузить таблицу через read_csv, выбрать нужные столбцы, обработать пропуски, при необходимости нормализовать, затем .to_numpy() и дальше - в NumPy или в тензоры PyTorch. Pandas отвечает за табличную логику, NumPy - за численные операции.
Не только чтение из файла: 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 - иначе кракозябры.
Pandas - библиотека для табличных данных: загрузка CSV, выбор столбцов и строк (в том числе loc/iloc), фильтрация по условию, обработка пропусков (fillna, dropna), группировка (groupby) и агрегация (mean, sum, count), сортировка (sort_values), запись в CSV (to_csv). Два главных типа - DataFrame (таблица) и Series (столбец). Связка с NumPy - метод .to_numpy() для передачи данных в модели.
Минимум для уверенного старта: уметь прочитать CSV, посмотреть head и shape, выбрать столбец или отфильтровать строки, при необходимости сгруппировать и посчитать среднее или сумму, сохранить результат в файл.
Сопоставьте операцию Pandas и её назначение
Выберите верные утверждения
Расставьте шаги обработки таблицы по порядку
Что вернёт выражение df['цена']?
Как удалить строки с пропусками в столбце 'A'?
Выберите подходящие конструкции для типичного сценария Pandas.
Что обязательно должно быть в скрипте с 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_task.py и загрузите его на проверку. Цель - показать, что вы умеете загружать данные, выполнять операции и при необходимости сохранять результат.
pandas as pd.pd.read_csv() с путём к файлу - для проверки достаточно создать таблицу в коде через pd.DataFrame(...).print() или сохраните в CSV через to_csv.Загрузите файл Python для проверки