Фильтрация, сортировка и выборка данных
Теперь, когда данные очищены и готовы к анализу, настало время начать извлекать из них ценность. На предыдущей странице мы избавились от пропусков, дубликатов и некорректных значений — теперь у нас чистый и надёжный датасет. Следующий шаг — научиться выбирать нужные данные, фильтровать по условиям и сортировать их для удобного анализа.
Эти операции — основа повседневной работы аналитика. Представьте: у вас датафрейм с миллионом строк продаж. Как быстро найти все заказы из Москвы дороже 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) и агрегатные функции мы научимся объединять данные в группы и рассчитывать сводные показатели. Именно это превращает сырые данные в бизнес-инсайты.
Готовы перейти от выборки к анализу? Тогда вперёд — там вас ждёт настоящая аналитическая мощь. 🚀