Новое Распределяем каналы MAX по категориям и территориям. Читать новость

Сортировка и фильтрация в 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 = None
df_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 и vk


isin() — фильтр по списку значений

Заменяет цепочку условий == через | (работает как «ИЛИ»). Короткая, удобная запись, особенно когда элементов много.

df[df['channel'].isin(['ya', 'vk'])] # оставить ya или vk

query() — альтернатива для читаемых сложных условий

df.query('cost > 1000 and channel != "ok"')
df.query('channel in ["ya", "vk"]')


💬 Далее:
Преобразование данных в Pandas
Просмотры: 230
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти