sort_values() в Pandas — сортировка данных

Коротко

sort_values() — метод для сортировки DataFrame или Series по значениям столбцов. Самая частая операция при анализе данных: отсортировать по выручке, дате, рейтингу. Поддерживает сортировку по нескольким столбцам, обработку NaN, кастомные ключи. На собеседованиях сортировка — базовый инструмент, который применяется в каждой второй задаче на pandas.

Базовое использование

import pandas as pd

df = pd.DataFrame({
    'user': ['Иван', 'Анна', 'Мария', 'Пётр'],
    'revenue': [5000, 12000, 3200, 8500],
    'orders': [3, 7, 2, 5]
})

# По убыванию выручки
df.sort_values('revenue', ascending=False)
#     user  revenue  orders
# 1   Анна    12000       7
# 3   Пётр     8500       5
# 0   Иван     5000       3
# 2  Мария     3200       2

По умолчанию ascending=True (по возрастанию). ascending=False — по убыванию. Индексы сохраняются.

Сортировка по нескольким столбцам

df = pd.DataFrame({
    'department': ['Sales', 'Sales', 'Dev', 'Dev', 'Sales'],
    'name': ['Иван', 'Анна', 'Пётр', 'Мария', 'Олег'],
    'salary': [90000, 120000, 150000, 130000, 90000]
})

# Сначала по отделу, потом по зарплате (убывание)
df.sort_values(['department', 'salary'], ascending=[True, False])
#   department   name  salary
# 2        Dev   Пётр  150000
# 3        Dev  Мария  130000
# 1      Sales   Анна  120000
# 0      Sales   Иван   90000
# 4      Sales   Олег   90000

Передайте список столбцов и список направлений. Сортировка идёт по первому столбцу, при равенстве — по второму.

Обработка NaN

df = pd.DataFrame({
    'name': ['Иван', 'Анна', 'Пётр', 'Мария'],
    'score': [85, None, 92, None]
})

# NaN в конце (по умолчанию)
df.sort_values('score')
#     name  score
# 0   Иван   85.0
# 2   Пётр   92.0
# 1   Анна    NaN
# 3  Мария    NaN

# NaN в начале
df.sort_values('score', na_position='first')
#     name  score
# 1   Анна    NaN
# 3  Мария    NaN
# 0   Иван   85.0
# 2   Пётр   92.0

na_position='last' (по умолчанию) или 'first'. Полезно при анализе пропусков — NaN наверху сразу видны.

Сброс индекса

# Индексы перемешаны после сортировки
sorted_df = df.sort_values('revenue', ascending=False)
print(sorted_df.index)  # [1, 3, 0, 2]

# Сбросить индекс
sorted_df = df.sort_values('revenue', ascending=False).reset_index(drop=True)
print(sorted_df.index)  # [0, 1, 2, 3]

reset_index(drop=True) — новый последовательный индекс. Без drop=True старый индекс станет столбцом.

sort_values vs sort_index

df = pd.DataFrame(
    {'value': [30, 10, 20]},
    index=['c', 'a', 'b']
)

df.sort_values('value')   # по значениям столбца value
df.sort_index()            # по индексу: a, b, c
  • sort_values('column') — сортировка по данным
  • sort_index() — сортировка по индексу (строковому или числовому)

nlargest и nsmallest — быстрый топ

# Топ-3 по выручке
df.nlargest(3, 'revenue')

# Антитоп-3
df.nsmallest(3, 'revenue')

# По нескольким столбцам (для разрешения ничьих)
df.nlargest(5, ['revenue', 'orders'])

nlargest и nsmallest быстрее, чем sort_values().head() на больших данных — не сортируют весь DataFrame, а используют алгоритм partial sort.

Кастомная сортировка: key

# Сортировка без учёта регистра
df.sort_values('name', key=lambda x: x.str.lower())

# Сортировка по длине строки
df.sort_values('name', key=lambda x: x.str.len())

# Сортировка по абсолютному значению
df.sort_values('change', key=abs)

Параметр key принимает функцию, которая трансформирует столбец перед сортировкой. Оригинальные данные не меняются.

Практические примеры

Топ-10 пользователей по выручке

top_users = (
    df.groupby('user_id')['amount']
    .sum()
    .sort_values(ascending=False)
    .head(10)
)

Сортировка событий по времени

df['event_time'] = pd.to_datetime(df['event_time'])
df = df.sort_values('event_time')

Хронологическая сортировка — первый шаг для построения воронок и анализа пользовательских путей.

Ранжирование внутри групп

df['rank'] = (
    df.sort_values(['department', 'salary'], ascending=[True, False])
    .groupby('department')
    .cumcount() + 1
)

Или через rank():

df['salary_rank'] = df.groupby('department')['salary'].rank(
    ascending=False, method='dense'
)

Аналог ROW_NUMBER / RANK / DENSE_RANK в SQL.

sort_values в SQL — аналог

Pandas SQL
df.sort_values('col') ORDER BY col ASC
df.sort_values('col', ascending=False) ORDER BY col DESC
df.sort_values(['a', 'b'], ascending=[True, False]) ORDER BY a ASC, b DESC
df.nlargest(10, 'col') ORDER BY col DESC LIMIT 10

Подробнее о сортировке в SQL — в гайде по ORDER BY.

Типичные ошибки

Забывают ascending=False. По умолчанию — по возрастанию. Для «топ по выручке» нужен ascending=False.

Сортировка inplace. df.sort_values('col') не меняет оригинал — возвращает новый DataFrame. Чтобы изменить оригинал: df = df.sort_values('col') или df.sort_values('col', inplace=True).

Сортировка строк как чисел. Если столбец содержит числа как строки ('10', '2', '9'), сортировка будет лексикографической: '10', '2', '9'. Конвертируйте в числа: df['col'] = df['col'].astype(int).

Вопросы с собеседований

-- Как отсортировать DataFrame по нескольким столбцам в разных направлениях? -- df.sort_values(['col1', 'col2'], ascending=[True, False]) — первый по возрастанию, второй по убыванию.

-- Чем nlargest лучше sort_values + head? -- nlargest использует partial sort (O(n + k log n)), sort_values — полную сортировку (O(n log n)). На больших данных nlargest быстрее.

-- Как поставить NaN в начало при сортировке? -- df.sort_values('col', na_position='first'). По умолчанию NaN в конце.

-- Аналог sort_values в SQL? -- ORDER BY. df.sort_values('revenue', ascending=False) = SELECT * FROM df ORDER BY revenue DESC.


Потренируйтесь решать задачи — откройте тренажёр с 1500+ вопросами для подготовки к собеседованиям аналитиков.

FAQ

Сортировка по столбцу с датами

Конвертируйте столбец в datetime через pd.to_datetime(), затем sort_values(). Строки-даты ('2025-03-15') сортируются лексикографически — это работает для ISO-формата (YYYY-MM-DD), но не для 'DD.MM.YYYY'.

Как сохранить отсортированный DataFrame?

df = df.sort_values('col') — переприсвоение. Или df.sort_values('col', inplace=True) — изменение на месте. Рекомендуется первый способ — он явнее и совместим с цепочками методов.

Стабильная сортировка в pandas

По умолчанию pandas использует mergesort (стабильная сортировка) — элементы с одинаковым ключом сохраняют относительный порядок. Можно изменить алгоритм: kind='quicksort', kind='heapsort'.

Как тренироваться

Сортировка — базовая операция pandas. Задачи на pandas и анализ данных — в тренажёре Карьерник. Больше вопросов — в разделе с примерами.