Сортировка по значениям столбцов
Сортируйте DataFrame по одному или нескольким столбцам с помощью sort_values(), задавайте порядок по возрастанию или убыванию и управляйте расположением NaN.
«Сортировка по значениям столбцов» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Зачем нужна сортировка
Сортировка DataFrame важна для представления (отчёты с первыми N строками, таблицы лидеров), корректности (для операций с временными рядами требуется хронологический порядок) и производительности (двоичный поиск в отсортированном индексе выполняется за O(log n), а не за O(n)). Метод Pandas sort_values() — основной инструмент сортировки по содержимому столбцов; он возвращает новый DataFrame, не изменяя исходный.
import pandas as pd
df = pd.DataFrame({
'name': ['Dave', 'Alice', 'Carol', 'Bob'],
'score': [75, 92, 88, 65]
})
# Sort by score descending (highest first)
ranked = df.sort_values('score', ascending=False)
print(ranked)
# name score
# 1 Alice 92
# 2 Carol 88
# 0 Dave 75
# 3 Bob 65sort_values() — базовое использование
DataFrame.sort_values(by) сортирует строки по значениям указанного столбца. Аргумент by принимает одно имя столбца (строку) или список имён столбцов для сортировки по нескольким ключам. По умолчанию сортировка выполняется по возрастанию (сначала меньшие значения). Для сортировки по убыванию передайте ascending=False.
import pandas as pd
df = pd.DataFrame({
'product': ['B', 'A', 'C', 'A', 'B'],
'price': [20, 10, 30, 15, 25]
})
# Ascending by price (default)
print(df.sort_values('price'))
# product price
# 1 A 10
# 3 A 15
# 0 B 20
# 4 B 25
# 2 C 30Сортировка по нескольким столбцам
Передача списка имён столбцов в sort_values(by=) выполняет сортировку по первому столбцу, затем разрешает совпадения с помощью второго столбца и так далее. Параметр ascending также может быть списком логических значений, соответствующих порядку столбцов, что позволяет задавать разное направление сортировки для каждого ключа.
import pandas as pd
df = pd.DataFrame({
'dept': ['HR', 'Eng', 'HR', 'Eng', 'Sales'],
'salary': [50000, 90000, 60000, 80000, 70000],
'name': ['Alice', 'Bob', 'Carol', 'Dave', 'Eve']
})
# Sort by dept A-Z, then by salary descending within each dept
sorted_df = df.sort_values(
by=['dept', 'salary'],
ascending=[True, False]
)
print(sorted_df)
# dept salary name
# 1 Eng 90000 Bob
# 3 Eng 80000 Dave
# 2 HR 60000 Carol
# 0 HR 50000 Alice
# 4 Sales 70000 EveРазмещение NaN с помощью na_position
По умолчанию значения NaN помещаются в конец результата независимо от направления сортировки. Используйте параметр na_position, чтобы управлять этим: 'last' (по умолчанию) или 'first'. Расположение NaN важно в таблицах с рангами: пропущенные значения могут означать «неизвестно» и должны быть чётко отделены от корректных элементов с рангами.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Carol', 'Dave'],
'score': [92, np.nan, 88, np.nan]
})
# NaN last (default)
print(df.sort_values('score', ascending=False, na_position='last'))
# name score
# 0 Alice 92.0
# 2 Carol 88.0
# 1 Bob NaN
# 3 Dave NaN
# NaN first
print(df.sort_values('score', na_position='first').head(2))Стабильная сортировка и параметр kind=
По умолчанию Pandas использует стабильную сортировку (mergesort, выполняемую за O(n log n)): если два значения ключа сортировки равны, сохраняется их исходный относительный порядок. Это важно, когда сначала выполняется сортировка по основному ключу, а затем по вторичному: порядок по основному ключу сохраняется среди элементов с одинаковыми значениями вторичного ключа. Алгоритм можно изменить с помощью kind='quicksort' (быстрее, но нестабильный) или kind='heapsort'.
import pandas as pd
df = pd.DataFrame({
'group': ['A', 'B', 'A', 'B'],
'value': [10, 10, 20, 20],
'original_row': [0, 1, 2, 3]
})
# Stable sort: equal values keep original relative order
result = df.sort_values('value', kind='mergesort')
print(result)
# group value original_row
# 0 A 10 0
# 1 B 10 1 <- row 0 before row 1 (stable)
# 2 A 20 2
# 3 B 20 3inplace=True и повторное присваивание
Как и большинство методов Pandas, sort_values() по умолчанию возвращает новый DataFrame. Передача inplace=True изменяет DataFrame на месте и возвращает None. Использование inplace обычно не рекомендуется в современном Pandas, поскольку усложняет построение конвейеров и отладку кода. Проще всегда выполнять повторное присваивание: df = df.sort_values('col').
import pandas as pd
df = pd.DataFrame({'x': [3, 1, 4, 1, 5]})
# Preferred: reassign
df = df.sort_values('x')
print(df['x'].tolist()) # [1, 1, 3, 4, 5]
# Alternative: inplace (not recommended for pipelines)
df2 = pd.DataFrame({'x': [3, 1, 4]})
df2.sort_values('x', inplace=True)
print(df2['x'].tolist()) # [1, 3, 4]Сброс индекса после сортировки
После сортировки индекс строк отражает исходные позиции. В таблице, отсортированной по убыванию, строка 0 теперь может иметь индекс 4. Вызовите .reset_index(drop=True), чтобы заново присвоить последовательные индексы, начиная с 0. Это важно перед использованием .iloc[0] для надёжного получения строки с первым рангом или перед экспортом в файл, где пропуски в индексах могут выглядеть непонятно.
import pandas as pd
df = pd.DataFrame({'score': [70, 90, 80]})
sorted_df = df.sort_values('score', ascending=False)
print(sorted_df)
# score
# 1 90
# 2 80
# 0 70
# Clean sequential index
reset_df = sorted_df.reset_index(drop=True)
print(reset_df)
# score
# 0 90
# 1 80
# 2 70Получение первых N строк с помощью nlargest() и nsmallest()
Для выбора первых или последних N строк по значению столбца методы df.nlargest(n, 'col') и df.nsmallest(n, 'col') эффективнее, чем сортировка всего DataFrame с последующим выделением нужных строк. Они используют частичную сортировку (выбор с помощью кучи) за O(n log k), а не за O(n log n), что особенно важно для больших DataFrames.
import pandas as pd
df = pd.DataFrame({
'product': ['A', 'B', 'C', 'D', 'E'],
'revenue': [5000, 12000, 8000, 3000, 15000]
})
# Top 3 by revenue
top3 = df.nlargest(3, 'revenue')
print(top3)
# product revenue
# 4 E 15000
# 1 B 12000
# 2 C 8000
# Bottom 2 by revenue
bottom2 = df.nsmallest(2, 'revenue')
print(bottom2)Сортировка категориальных столбцов в порядке категорий
При сортировке столбца с типом данных упорядоченная Categorical метод sort_values() соблюдает порядок категорий, а не алфавитный порядок. Это необходимо для правильной сортировки уровней приоритета, оценок серьёзности или обозначений размера: «Small» должно идти перед «Medium», а «Medium» — перед «Large», а не в алфавитном порядке, где «Large» оказалось бы первым.
import pandas as pd
df = pd.DataFrame({
'size': pd.Categorical(
['Large', 'Small', 'Medium', 'Small', 'Large'],
categories=['Small', 'Medium', 'Large'],
ordered=True
),
'count': [10, 5, 8, 3, 7]
})
print(df.sort_values('size'))
# size count
# 1 Small 5
# 3 Small 3
# 2 Medium 8
# 0 Large 10
# 4 Large 7Объединение сортировки с другими операциями
Поскольку sort_values() возвращает DataFrame, этот метод естественно встраивается в цепочки методов. Типичный шаблон выглядит так: отфильтровать строки → выполнить агрегацию → отсортировать → показать первые N строк. Цепочки сохраняют линейность и наглядность конвейера преобразований.
import pandas as pd
df = pd.DataFrame({
'dept': ['Eng', 'HR', 'Eng', 'Sales', 'HR', 'Eng'],
'salary': [90000, 50000, 120000, 70000, 55000, 80000]
})
result = (
df
.groupby('dept')['salary'].mean()
.reset_index()
.sort_values('salary', ascending=False)
.head(2)
)
print(result)
# dept salary
# 0 Eng 96666.67
# 2 Sales 70000.00Практика: отчёт о пяти лучших товарах
Ниже приведён практический пример полного создания отчёта о пяти лучших товарах по выручке: загрузить данные, вычислить общую выручку для каждого товара, отсортировать по убыванию, выбрать первые 5 строк, сбросить индекс для получения аккуратных номеров рангов и добавить столбец ранга для отображения.
import pandas as pd
orders = pd.DataFrame({
'product': ['A', 'B', 'A', 'C', 'B', 'D', 'E', 'A', 'C', 'E'],
'revenue': [100, 200, 150, 80, 300, 60, 400, 120, 90, 350]
})
top5 = (
orders
.groupby('product')['revenue'].sum()
.reset_index()
.sort_values('revenue', ascending=False)
.head(5)
.reset_index(drop=True)
)
top5.index = top5.index + 1 # rank from 1
top5.index.name = 'rank'
print(top5)Быстрая проверка
Проверьте, насколько хорошо Вы поняли сортировку DataFrames по значениям столбцов.
Повторение урока
В этом уроке Вы узнали, что sort_values(by=) сортирует по одному или нескольким столбцам, ascending= может быть списком для задания разного направления для каждого ключа, na_position='last' управляет расположением NaN, а nlargest()/nsmallest() эффективно извлекают первые или последние N строк без сортировки всего DataFrame. После сортировки всегда вызывайте reset_index(), чтобы получить аккуратный последовательный результат. Далее Вы узнаете о сортировке по индексу DataFrame.
Часто задаваемые вопросы
Урок «Сортировка по значениям столбцов» бесплатный?
Да — полный текст урока «Сортировка по значениям столбцов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Чему я научусь в уроке «Сортировка по значениям столбцов»?
Сортируйте DataFrame по одному или нескольким столбцам с помощью sort_values(), задавайте порядок по возрастанию или убыванию и управляйте расположением NaN. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?
Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Сортировка по значениям столбцов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?
Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Сортировка по значениям столбцов
- Сортировка по индексу
- Ранжирование значений
- Установка и сброс индекса