Сортировка и фильтрация в Pandas
🃏 Сортировка по значениям столбцов: sort_values()
Обязательная база:
• by (столбец / список столбцов) — порядок задаёт приоритет
• ascending (направление)
- True — по возрастанию
- False — по убыванию
# ❌ краткая форма (для нескольких столбцов без by= — ошибка)df.sort_values('cost', ascending=False)
# ✅ явная форма — рекомендуется
df.sort_values(by='cost', ascending=False)
Опционально:
• inplace — изменить исходный DataFrame (True) или вернуть копию (False, по умолч.)
• ignore_index — сбросить индекс и создать новый последовательный (0…n-1)
• key — векторизованная функция, применяемая к значениям перед сортировкой
• na_position — куда помещать NaN, None: 'first' (в начало) или 'last' (в конец, по умолч.)
❗️Частая ловушка: inplace и присваивание
`inplace=True` возвращает `None`, не пытайся поймать его в переменную.
# ❌ df_sorted = Nonedf_sorted = df.sort_values(by='cost', inplace=True)
# ✅ Два правильных варианта:# 1. Меняем исходник — без присваиванияdf.sort_values(by='cost', inplace=True)
# 2. Создаём копию — inplace=False
df_sorted = df.sort_values(by='cost')
9️⃣ Сортировка по индексу: sort_index()
df_sorted = df.sort_index(ascending=False)• Полезно, если индекс — временная метка (быстрый просмотр последних записей)
• Сортировка колонок по именам: df.sort_index(axis=1)
🔥 Быстрая сортировка топ‑N
• nlargest() — N наибольших значений (от большего)
• nsmallest() — N наименьших значений (от меньшего)
На больших данных работает быстрее, чем sort_values().head(n):
- sort_values() сортирует все строки
- nlargest() использует алгоритм — O(n log N), где N — малое число
top_3 = df.nlargest(3, 'cost')
bottom_3 = df.nsmallest(3, 'cost')🦾 Продвинутые приёмы (кратко)
• `key` — для преобразования значений перед сортировкой (регистронезависимая сортировка и т.д.):
df.sort_values(by='name', key=lambda col: col.str.lower())• Категории — для своего порядка сортировки (не лексикографического):
- преобразовать столбец к типу CategoricalDtype с ordered=True
- указать порядок categories (например: 'low' < 'medium' < 'high')
- далее обычный sort_values()
from pandas.api.types import CategoricalDtype
df['priority'] = df['priority'].astype(
CategoricalDtype(categories=['low', 'medium', 'high'], ordered=True)
)
df.sort_values('priority') # low → medium → high✅ После сортировки: reset_index()
Если не использовать ignore_index=True, после сортировки старый индекс «едет». Чтобы сохранить данные (например, ID пользователя) — применить reset_index():
df_sorted = df.sort_values('cost').reset_index()
# старый индекс стал колонкой index, добавили новый индекс
⚠️ ignore_index=True отбрасывает старый индекс, восстановить его нельзя. Не смешивайте оба подхода.
👩🎓 Выбор алгоритма сортировки: kind
• 'quicksort' (по умолчанию) — быстрый, но нестабильный (равные элементы могут поменять порядок)
• 'mergesort' / 'stable' — стабильный (сохраняет исходный порядок равных ключей)
• 'heapsort' — нестабильный
🌪 Фильтрация
Логика: оставляем строки, где условие истинно.
Базовое условие
df[df['cost'] > 1000] # сравнение со скаляромСложное условие (И / ИЛИ)
- & — оба условия истинны (И)
- | — хотя бы одно истинно (ИЛИ)
- Каждое условие обязательно в своих круглых скобках – иначе Pandas не поймёт порядок операций
df[(df['cost'] > 1000) & (df['channel'] != 'ok')] # И
df[(df['channel'] == 'ya') | (df['channel'] == 'vk')] # ИЛИОтрицание условия — тильда ~
df[~(df['cost'] > 1000)] # строки, где cost <= 1000
df[~df['channel'].isin(['ya', 'vk'])] # все каналы, кроме ya и vkisin() — фильтр по списку значений
Заменяет цепочку условий == через | (работает как «ИЛИ»). Короткая, удобная запись, особенно когда элементов много.
df[df['channel'].isin(['ya', 'vk'])] # оставить ya или vkquery() — альтернатива для читаемых сложных условий
df.query('cost > 1000 and channel != "ok"')
df.query('channel in ["ya", "vk"]')💬 Далее:
Преобразование данных в Pandas