Фильтрация, сортировка и выборка данных

Теперь, когда данные очищены и готовы к анализу, настало время начать извлекать из них ценность. На предыдущей странице мы избавились от пропусков, дубликатов и некорректных значений — теперь у нас чистый и надёжный датасет. Следующий шаг — научиться выбирать нужные данные, фильтровать по условиям и сортировать их для удобного анализа.

Эти операции — основа повседневной работы аналитика. Представьте: у вас датафрейм с миллионом строк продаж. Как быстро найти все заказы из Москвы дороже 10 000 рублей? Или отсортировать клиентов по дате последней покупки? Без фильтрации и сортировки это было бы невозможно. Именно эти навыки дают вам контроль над данными.

В этом уроке мы освоим ключевые методы в Pandas — библиотеке, которая стала стандартом для анализа данных в Python. Мы будем использовать реалистичные, но простые примеры, чтобы вы могли сразу применять знания на практике.

Фильтрация данных: отбираем нужное

Фильтрация — это процесс отбора строк, удовлетворяющих определённому условию. В Pandas для этого чаще всего используется метод .loc, который позволяет выбирать данные по меткам (именам строк и столбцов).

Допустим, у нас есть датафрейм sales с колонками:

  • region — регион продажи
  • amount — сумма заказа
  • date — дата покупки

Чтобы выбрать все строки, где регион — Москва, пишем:

moscow_sales = sales.loc[sales['region'] == 'Москва']

Здесь sales['region'] == 'Москва' создаёт булев индекс — серию из True и False, где True означает, что условие выполнено. Метод .loc использует этот индекс, чтобы оставить только строки с True.

🔍 Важно: Всегда используйте .loc для фильтрации. Это делает код понятным и избегает неожиданного поведения.

Составные условия: комбинируем логику

На практике редко бывает достаточно одного условия. Часто нужно фильтровать по нескольким критериям одновременно. Для этого используются логические операторы:

  • & — логическое И (оба условия должны быть верны)
  • | — логическое ИЛИ (хотя бы одно условие верно)
  • ~ — логическое НЕ (обратное условие)

Пример: выберем продажи из Москвы и с суммой больше 10 000:

high_value_moscow = sales.loc[(sales['region'] == 'Москва') & (sales['amount'] > 10000)]

Обратите внимание на круглые скобки вокруг каждого условия. Без них Python не сможет правильно определить порядок операций, и вы получите ошибку. Это одна из самых частых ошибок у новичков.

⚠️ Не используйте and, or, not в условиях для Pandas. Они работают с отдельными значениями, а не с сериями. Всегда используйте &, |, ~.

Пример с ИЛИ: найдём продажи из Москвы или Санкт-Петербурга:

msk_spb_sales = sales.loc[(sales['region'] == 'Москва') | (sales['region'] == 'Санкт-Петербург')]

Выборка столбцов: работаем только с нужными данными

Часто не нужно отображать все столбцы. Например, после фильтрации вы можете захотеть оставить только date и amount. Это делается с помощью списка названий:

moscow_amounts = sales.loc[sales['region'] == 'Москва', ['date', 'amount']]

Обратите внимание на двойные квадратные скобки:

  • Одинарные — для одного столбца: ['amount']
  • Двойные — для списка: [['date', 'amount']]

Если забыть вторую пару, Pandas может выдать предупреждение или неверный результат.

Сортировка данных: наводим порядок

После фильтрации часто нужно упорядочить данные. Например, отсортировать продажи по убыванию суммы, чтобы увидеть самые крупные заказы.

Для этого используется метод sort_values():

sorted_sales = sales.sort_values(by='amount', ascending=False)
  • by — указывает, по какому столбцу сортировать
  • ascending=False — сортировка по убыванию (от большего к меньшему)

Можно сортировать по нескольким столбцам. Например, сначала по региону (в алфавитном порядке), затем — по сумме (по убыванию):

sorted_by_region_and_amount = sales.sort_values(by=['region', 'amount'], ascending=[True, False])

Также существует sort_index(), который сортирует строки по индексу. Он полезен, если индекс — дата, и вы хотите упорядочить данные по времени:

sales_sorted_by_date = sales.sort_index()

Распространённые ошибки и как их избежать

Даже простые операции могут вызывать предупреждения. Один из самых частых — SettingWithCopyWarning. Он появляется, когда вы пытаетесь изменить данные, полученные в результате фильтрации:

# Так делать НЕ НАДО:
filtered = sales.loc[sales['region'] == 'Москва']
filtered['amount'] = filtered['amount'] * 1.1  # ⚠️ Предупреждение!

Pandas не уверен, работаете ли вы с копией или с оригиналом. Чтобы избежать этого, явно создайте копию:

filtered = sales.loc[sales['region'] == 'Москва'].copy()
filtered['amount'] = filtered['amount'] * 1.1  # ✅ Теперь всё в порядке

Также следите за типами данных. Например, если столбец amount — строка, сравнение > 10000 не сработает. Проверяйте типы с помощью dtypes и, при необходимости, конвертируйте с помощью astype().

Практические задания

Попробуйте применить полученные знания. Представим, что sales — это ваш датафрейм с очищенными данными (как на предыдущем уроке).

Задание 1: Выберите все продажи, где сумма больше 5 000 и регион — Санкт-Петербург.

# Ваш код здесь

Задание 2: Отсортируйте данные по дате в порядке убывания, а затем — по сумме в порядке убывания.

# Ваш код здесь

Задание 3: Выберите только столбцы date и amount для продаж из Москвы, отсортированные по сумме по убыванию.

# Ваш код здесь

Проверьте результат в Jupyter Notebook. Убедитесь, что код выполняется без ошибок и возвращает ожидаемые данные.

Что дальше?

Теперь вы умеете фильтровать, сортировать и выбирать данные — ключевые навыки для любого аналитика. Вы можете быстро находить нужную информацию даже в больших датасетах.

Но что, если нужно не просто отобрать строки, а подсчитать итоги? Например, узнать общую выручку по регионам или средний чек по месяцам?

Это — следующий шаг. В уроке Группировка данных (groupby) и агрегатные функции мы научимся объединять данные в группы и рассчитывать сводные показатели. Именно это превращает сырые данные в бизнес-инсайты.

Готовы перейти от выборки к анализу? Тогда вперёд — там вас ждёт настоящая аналитическая мощь. 🚀