Pandas Core — Фундамент работы с таблицами
Цели лекции
- Понять архитектуру Pandas и её связь с NumPy.
- Научиться правильно "доставать" данные: освоить разницу между
locиiloc. - Освоить базовый пайплайн: Загрузка -> Первичный осмотр -> Фильтрация.
Часть 1: Философия Pandas. Series и DataFrame
Почему нам мало NumPy? NumPy прекрасен для вычислений, но ужасен для аналитики. В NumPy строка №5 — это просто индекс 5. В бизнесе строка — это "Клиент ID 450", а столбец — это "Выручка". Нам нужны метки (labels).
1.1. Аналогия: Excel на стероидах
- NumPy — это лист бумаги, расчерченный в клетку, где записаны только цифры.
- Pandas — это Excel-файл. У строк есть имена (индексы), у столбцов — заголовки. Типы данных могут смешиваться (числа, даты, текст).
1.2. Основные структуры данных
Всего два объекта, которые нужно знать:
- Series (Серия): Одномерный массив с метками.
- Аналогия: Один столбец в Excel.
- Под капотом: Это массив NumPy (значения) + массив индексов.
- DataFrame (Датафрейм): Двумерная таблица.
- Аналогия: Вся таблица Excel или SQL-таблица.
- Важно: DataFrame — это словарь (dict) из Series. Это значит, что операция
df['col_name']очень быстрая, а получение строки — чуть медленнее.
Часть 2: Индексация — Главный источник ошибок
Самая частая ошибка новичков — путаница, как выбрать данные. "Я хочу 5-ю строку" или "Я хочу строку с индексом 5"? Это разные вещи.
2.1. Операторы доступа
В Pandas есть два строгих "ключа" доступа к данным:
"Язык робота". Работает по позиции (0, 1, 2...).
df.iloc[0]— дай мне физически первую строку таблицы, неважно, как она называется.- Аналог обычных списков Python.
2.2. Slicing (Срезы) в Pandas
Критическое отличие срезов
- В Python/NumPy/iloc:
0:5не включает правую границу (вернет 0, 1, 2, 3, 4). - В
.loc:start:stopвключает правую границу. Если вы напишетеdf.loc['Jan':'Mar'], вы получите и Январь, и Март.
2.3. View vs Copy (Предупреждение)
Осторожно с цепным присваиванием
Избегайте цепных присваиваний: df[mask]['col'] = 0. Pandas не гарантирует, вернет он копию или ссылку. Вы можете получить SettingWithCopyWarning.
Правильно: Использовать .loc для одновременного доступа к строкам и столбцам:
df.loc[mask, 'col'] = 0Часть 3: Загрузка и Первичный осмотр (EDA Lite)
Прежде чем обучать модели, нужно понять, что за "мусор" к нам пришел.
3.1. Чтение данных
Рабочая лошадка — pd.read_csv().
- Аргументы инженера:
sep=: разделитель (запятая, точка с запятой, таб).parse_dates=: список колонок, которые нужно сразу превратить вdatetime(иначе будут строками, и вы не сможете сортировать по времени).index_col=: какую колонку сделать индексом сразу при чтении.
3.2. Sanity Check (Проверка на адекватность)
Три метода, которые нужно вызывать рефлекторно:
df.head(): Взглянуть на структуру.df.info(): Проверить типы данных (Dtypes) и наличие пропусков (Non-Null Count). Если колонка с ценой имеет типobject— значит, там есть "грязь" (например, символ "$").df.describe(): Статистика. Среднее, минимум, максимум. Позволяет увидеть аномалии (например, возраст -1 или цена 0).
Часть 4: Фильтрация данных
Фильтрация в Pandas — это то же самое, что и Boolean Masking в NumPy (из Лекции 1).
4.1. Логические маски
mask = df['Age'] > 18
adults = df[mask]Синтаксис компактнее: df[df['Age'] > 18].
4.2. Множественные условия
В Python мы пишем and / or. В Pandas (и NumPy) мы используем побитовые операторы:
&(И)|(ИЛИ)~(НЕ)
Важное правило
Каждое условие нужно брать в круглые скобки ().
# Люди старше 18 И из города NY
df[(df['Age'] > 18) & (df['City'] == 'NY')]4.3. Метод query()
Для тех, кто скучает по SQL. Позволяет писать условия строкой:
df.query("Age > 18 and City == 'NY'")Это читабельнее, но не всегда удобнее при программной генерации условий.