Как сортировать 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, 35. Сортировка по индексу
# по индексу (числовой или 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+ вопросами для собесов.