machine-learningЛекцияPython

Pandas Core — Фундамент работы с таблицами

👀 Загрузка...

Цели лекции

  1. Понять архитектуру Pandas и её связь с NumPy.
  2. Научиться правильно "доставать" данные: освоить разницу между loc и iloc.
  3. Освоить базовый пайплайн: Загрузка -> Первичный осмотр -> Фильтрация.

Часть 1: Философия Pandas. Series и DataFrame

Почему нам мало NumPy? NumPy прекрасен для вычислений, но ужасен для аналитики. В NumPy строка №5 — это просто индекс 5. В бизнесе строка — это "Клиент ID 450", а столбец — это "Выручка". Нам нужны метки (labels).

1.1. Аналогия: Excel на стероидах

  • NumPy — это лист бумаги, расчерченный в клетку, где записаны только цифры.
  • Pandas — это Excel-файл. У строк есть имена (индексы), у столбцов — заголовки. Типы данных могут смешиваться (числа, даты, текст).

1.2. Основные структуры данных

Всего два объекта, которые нужно знать:

  1. Series (Серия): Одномерный массив с метками.
    • Аналогия: Один столбец в Excel.
    • Под капотом: Это массив NumPy (значения) + массив индексов.
  2. 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 (Проверка на адекватность)

Три метода, которые нужно вызывать рефлекторно:

  1. df.head(): Взглянуть на структуру.
  2. df.info(): Проверить типы данных (Dtypes) и наличие пропусков (Non-Null Count). Если колонка с ценой имеет тип object — значит, там есть "грязь" (например, символ "$").
  3. 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'")

Это читабельнее, но не всегда удобнее при программной генерации условий.


🧠 Проверка знаний

Какое утверждение верно описывает разницу в работе срезов (slicing) между .loc и .iloc?

Какой метод Pandas нужно использовать для быстрого определения того, не содержит ли колонка с числовыми данными строковый 'мусор' (например, если она случайно получила тип object)?