Как сортировать DataFrame в pandas

Карьерник — квиз-тренажёр в Telegram с 1500+ вопросами для собесов аналитика. SQL, Python, A/B, метрики. Бесплатно.

Две функции сортировки

  • sort_values() — по значениям в колонке (самое частое)
  • sort_index() — по индексу

1. По одной колонке

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'age': [30, 25, 35, 28],
    'score': [85, 92, 78, 95]
})

# по возрасту от младшего к старшему
df.sort_values('age')

# от старшего к младшему
df.sort_values('age', ascending=False)

2. По нескольким колонкам

# сортировка по age ASC, при равных — по score DESC
df.sort_values(
    by=['age', 'score'],
    ascending=[True, False]
)

Список ascending должен совпадать по длине со списком by.

3. Сохранение результата

# sort_values ВОЗВРАЩАЕТ новый DataFrame, не меняет исходный
sorted_df = df.sort_values('age')

# меняем исходный
df = df.sort_values('age')
# или
df.sort_values('age', inplace=True)

Важно: inplace=True считается устаревшим паттерном. Современный Python-стиль — присваивание.

4. Сортировка с NaN

По умолчанию NaN в конце:

df = pd.DataFrame({'a': [1, None, 3, 2]})
df.sort_values('a')
# 1, 2, 3, NaN

Переместить NaN в начало:

df.sort_values('a', na_position='first')
# NaN, 1, 2, 3

5. Сортировка по индексу

# по индексу (числовой или datetime)
df.sort_index()

# по индексу в обратном порядке
df.sort_index(ascending=False)

Особенно полезно для timeseries:

ts = pd.DataFrame(..., index=pd.date_range('2026-01-01', periods=100))
ts = ts.sort_index()  # гарантирует хронологический порядок

6. Сортировка Series

s = pd.Series([3, 1, 4, 1, 5, 9, 2, 6])
s.sort_values()              # по возрастанию
s.sort_values(ascending=False)  # по убыванию

7. После сортировки — сброс индекса

После sort_values индекс сохраняет старые значения (не 0, 1, 2...). Если нужен новый:

df.sort_values('age').reset_index(drop=True)

drop=True — не сохранять старый индекс как колонку.

8. Топ-N после сортировки

# 5 самых молодых
df.sort_values('age').head(5)

# 5 самых старых
df.sort_values('age', ascending=False).head(5)

# или через nlargest/nsmallest (быстрее)
df.nlargest(5, 'age')
df.nsmallest(5, 'age')

nlargest / nsmallest эффективнее сортировки, если нужно только N.

9. Sort с учётом регистра

df = pd.DataFrame({'name': ['bob', 'Alice', 'charlie']})

# стандартно: заглавные буквы идут первыми
df.sort_values('name')  # Alice, bob, charlie

# регистронезависимо через ключ
df.sort_values('name', key=lambda col: col.str.lower())
# Alice, bob, charlie (по алфавиту)

10. Sort с кастомной функцией

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

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

По умолчанию sort_values использует quicksort. Для стабильной сортировки (сохраняет порядок равных) — mergesort:

df.sort_values('category', kind='mergesort')

Полезно, когда сортируете по разным критериям последовательно.

12. Sort + groupby

Внутри каждой группы отсортировать и взять топ:

# топ-2 по score в каждом департаменте
df.sort_values(['department', 'score'], ascending=[True, False]) \
  .groupby('department') \
  .head(2)

13. Sort + rank

# добавить колонку rank в отсортированном DF
df_sorted = df.sort_values('score', ascending=False)
df_sorted['rank'] = range(1, len(df_sorted) + 1)

14. MultiIndex sort

df = pd.DataFrame(data, index=pd.MultiIndex.from_tuples([...]))

# по первому уровню
df.sort_index(level=0)

# по нескольким уровням
df.sort_index(level=['country', 'city'])

Частые ошибки

Ошибка 1. Забыть присвоить результат

# не меняет df
df.sort_values('age')

# правильно
df = df.sort_values('age')
# или с inplace
df.sort_values('age', inplace=True)

Ошибка 2. Писать колонку в кавычках внутри by

# работает, но некрасиво для одной колонки
df.sort_values(by=['age'])

# короче для одной
df.sort_values('age')

Ошибка 3. Расхождение длины by и ascending

# ошибка
df.sort_values(by=['a', 'b'], ascending=True)

# правильно
df.sort_values(by=['a', 'b'], ascending=[True, True])
# или
df.sort_values(by=['a', 'b'], ascending=True)  # работает если один bool

Ошибка 4. Забыть reset_index

После сортировки индекс «разбросан». Для последующего iloc обычно нужен reset_index.

Связанные темы

FAQ

sort_values или sort_index?

sort_values — по данным в колонках. sort_index — по индексу (обычно для timeseries).

Как сортировать по нескольким колонкам?

df.sort_values(by=['col1', 'col2'], ascending=[True, False]).

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

По умолчанию quicksort — нестабильна. Для стабильной — kind='mergesort' или 'stable'.

inplace или assignment?

Современный стиль — assignment (df = df.sort_values(...)). inplace считается устаревшим.


Тренируйте Python и pandas — откройте тренажёр с 1500+ вопросами для собесов.