0Pricing
Pandas & NumPy Academy · Урок

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

Сортируйте 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     65

sort_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             3

inplace=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 — локальная установка не требуется.

Все уроки этого курса

  1. Сортировка по значениям столбцов
  2. Сортировка по индексу
  3. Ранжирование значений
  4. Установка и сброс индекса
← Назад к Pandas & NumPy Academy