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.0na_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, csort_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 и анализ данных — в тренажёре Карьерник. Больше вопросов — в разделе с примерами.