Нашли ошибку?
базовыйpandas 3.0.6

Сортировка

Упорядочить строки по одному или нескольким столбцам, по индексу или взять n наибольших.

Нужно знать:DataFrame

Содержание статьи

Коротко

  • sort_values("col") — по столбцу; список столбцов — по нескольким, ascending — список направлений.
  • Пропуски по умолчанию идут в конец (na_position="last").
  • key= — функция, применяемая к столбцу перед сравнением: например, без учёта регистра.
  • sort_index() — по индексу; помогает вернуть исходный порядок строк.
  • nlargest(n, "col") / nsmallest — n строк с наибольшими / наименьшими значениями, быстрее полной сортировки.
  • Сортировка возвращает новую таблицу; индекс остаётся прежним, пока не передать ignore_index=True.

Синтаксис

df.sort_values(by, ascending=True, na_position="last", key=None, ignore_index=False)
df.sort_index(ascending=True)
df.nlargest(n, columns), df.nsmallest(n, columns)

Параметры

ПараметрЧто делаетПо умолчанию
byстолбец или список столбцовобязательный
ascendingпо возрастанию; список — своё направление для каждого столбцаTrue
na_position"last" или "first" — куда ставить пропуски"last"
keyфункция от Series, результат которой сравниваетсяNone
ignore_indexзаменить индекс на 0, 1, 2…False
kindалгоритм; "stable" сохраняет порядок равных (для нескольких столбцов сортировка всегда устойчивая)"quicksort"

Примеры

Данные для примеровиспользуются во всех примерах ниже
staff = pd.DataFrame({
    "name": ["Вика", "аня", "Борис", "Глеб", "Дина"],
    "dept": ["IT", "HR", "IT", "HR", "IT"],
    "salary": [95, 60, 120, None, 95],
})
По одному столбцу
staff.sort_values("salary")                       # пропуски — в конце
Вывод
    name dept  salary
1    аня   HR    60.0
0   Вика   IT    95.0
4   Дина   IT    95.0
2  Борис   IT   120.0
3   Глеб   HR     NaN
По убыванию
staff.sort_values("salary", ascending=False)
Вывод
    name dept  salary
2  Борис   IT   120.0
0   Вика   IT    95.0
4   Дина   IT    95.0
1    аня   HR    60.0
3   Глеб   HR     NaN
По нескольким столбцам
staff.sort_values(["dept", "salary"], ascending=[True, False])   # отдел по алфавиту, зарплата по убыванию
Вывод
    name dept  salary
1    аня   HR    60.0
3   Глеб   HR     NaN
2  Борис   IT   120.0
0   Вика   IT    95.0
4   Дина   IT    95.0
Без учёта регистра
staff.sort_values("name", key=lambda s: s.str.lower())           # без учёта регистра
Вывод
    name dept  salary
1    аня   HR    60.0
2  Борис   IT   120.0
0   Вика   IT    95.0
3   Глеб   HR     NaN
4   Дина   IT    95.0
Пропуски в начале и новый индекс
staff.sort_values("salary", na_position="first", ignore_index=True)
Вывод
    name dept  salary
0   Глеб   HR     NaN
1    аня   HR    60.0
2   Вика   IT    95.0
3   Дина   IT    95.0
4  Борис   IT   120.0
Вернуть порядок по индексу
staff.sort_values("salary").sort_index()          # вернуть исходный порядок строк
Вывод
    name dept  salary
0   Вика   IT    95.0
1    аня   HR    60.0
2  Борис   IT   120.0
3   Глеб   HR     NaN
4   Дина   IT    95.0
n наибольших
staff.nlargest(2, "salary")                       # две наибольшие зарплаты
Вывод
    name dept  salary
2  Борис   IT   120.0
0   Вика   IT    95.0

Подводные камни

Результат не сохранили

sort_values не меняет таблицу. Присвойте результат: staff = staff.sort_values("salary").

Сортировка без присваивания
staff.sort_values("salary")                       # результат не сохранён…
staff.head(2)                                     # …таблица осталась прежней
Вывод
   name dept  salary
0  Вика   IT    95.0
1   аня   HR    60.0

Заглавные и строчные буквы

Строки сравниваются по кодам символов: все заглавные идут раньше строчных, поэтому «аня» оказывается после «Дины». Для сортировки без учёта регистра передайте key.