Привет! Ты уже умеешь загружать данные, фильтровать, группировать и агрегировать. Но часто нужно упорядочить данные: показать топ-10 продаж, отсортировать студентов по баллам или просто расположить данные в хронологическом порядке. Для этого в Pandas есть инструменты сортировки и ранжирования.
В этой статье мы разберём:
- Сортировка по одной колонке:
sort_values() - Сортировка по нескольким колонкам
- Сортировка по индексу:
sort_index() - Ранжирование значений:
rank() - Разные методы ранжирования (average, min, max, first, dense)
- Что нужно знать перед началом
- Основная часть
- Подготовка данных
- Сортировка по одной колонке: sort_values()
- Сортировка по убыванию
- Сортировка по нескольким колонкам
- Сортировка по индексу: sort_index()
- Изменение исходного DataFrame: inplace
- Ранжирование: rank()
- Методы ранжирования
- method=’average’ (по умолчанию)
- method=’min’
- method=’max’
- method=’first’
- method=’dense’
- Сравнение методов ранжирования
- Ранжирование с группировкой
- Сортировка с пропусками (NaN)
- Практический пример: топ-студенты
- Задачи для закрепления
- Нюансы и подводные камни
- Сортировка с разными типами
- Ранжирование с пропусками
- Производительность
- Частые ошибки и как их избежать
- Ошибка 1: Забыл ascending для нескольких колонок
- Ошибка 2: Путаница между sort_values() и sort_index()
- Ошибка 3: Неправильный method в rank()
- Шпаргалка
- Заключение
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Pandas (
pip install pandas) - Базовое понимание DataFrame и колонок
- Желание упорядочивать данные
Совет: Сортировка — это простой, но очень важный шаг в анализе данных. Она помогает быстро увидеть максимумы, минимумы и общую структуру данных.
Основная часть
Подготовка данных
import pandas as pd
import numpy as np
np.random.seed(42)
# Создаём данные о студентах
data = {
'Имя': ['Анна', 'Иван', 'Мария', 'Пётр', 'Ольга', 'Сергей', 'Елена', 'Дмитрий'],
'Группа': ['А', 'Б', 'А', 'В', 'Б', 'А', 'В', 'Б'],
'Баллы': [85, 92, 78, 88, 95, 65, 90, 82],
'Возраст': [20, 21, 19, 22, 20, 21, 19, 22]
}
df = pd.DataFrame(data)
print("Исходные данные:")
print(df)Результат:
Имя Группа Баллы Возраст
0 Анна А 85 20
1 Иван Б 92 21
2 Мария А 78 19
3 Пётр В 88 22
4 Ольга Б 95 20
5 Сергей А 65 21
6 Елена В 90 19
7 Дмитрий Б 82 22Сортировка по одной колонке: sort_values()
# Сортируем по баллам (по возрастанию)
df_sorted = df.sort_values('Баллы')
print("Сортировка по баллам (по возрастанию):")
print(df_sorted)Результат:
Имя Группа Баллы Возраст
5 Сергей А 65 21
2 Мария А 78 19
7 Дмитрий Б 82 22
0 Анна А 85 20
3 Пётр В 88 22
6 Елена В 90 19
1 Иван Б 92 21
4 Ольга Б 95 20Сортировка по убыванию
# Сортируем по баллам (по убыванию)
df_sorted = df.sort_values('Баллы', ascending=False)
print("Сортировка по баллам (по убыванию):")
print(df_sorted)Результат:
Имя Группа Баллы Возраст
4 Ольга Б 95 20
1 Иван Б 92 21
6 Елена В 90 19
3 Пётр В 88 22
0 Анна А 85 20
7 Дмитрий Б 82 22
2 Мария А 78 19
5 Сергей А 65 21Совет:
ascending=Falseсортирует по убыванию. По умолчаниюascending=True(по возрастанию).
Сортировка по нескольким колонкам
# Сортируем по группе (по возрастанию), затем по баллам (по убыванию)
df_sorted = df.sort_values(['Группа', 'Баллы'], ascending=[True, False])
print("Сортировка по группе (А→В) и баллам (по убыванию):")
print(df_sorted)Результат:
Имя Группа Баллы Возраст
0 Анна А 85 20
2 Мария А 78 19
5 Сергей А 65 21
4 Ольга Б 95 20
1 Иван Б 92 21
7 Дмитрий Б 82 22
6 Елена В 90 19
3 Пётр В 88 22Совет: В
ascendingпередавай список: первое значение для первой колонки, второе — для второй.
Сортировка по индексу: sort_index()
# Создаём DataFrame с перемешанным индексом
df_mixed = df.sort_values('Баллы').reset_index(drop=True)
print("DataFrame с новым порядком:")
print(df_mixed)
# Сортируем по индексу
df_reset = df_mixed.sort_index()
print("\nПосле сортировки по индексу:")
print(df_reset)Совет:
sort_index()полезен, когда нужно восстановить порядок строк после операций.
Изменение исходного DataFrame: inplace
# Сортируем и изменяем исходный DataFrame
df.sort_values('Баллы', ascending=False, inplace=True)
print("Исходный DataFrame после сортировки (inplace):")
print(df)Совет:
inplace=Trueизменяет исходный DataFrame без создания копии. Используй с осторожностью.
Ранжирование: rank()
rank() присваивает каждой строке ранг (место) на основе значений в колонке.
# Добавляем ранг по баллам (по умолчанию method='average')
df['Ранг'] = df['Баллы'].rank(ascending=False)
print("Ранжирование по баллам (по убыванию):")
print(df[['Имя', 'Баллы', 'Ранг']])Результат:
Имя Баллы Ранг
4 Ольга 95 1.0
1 Иван 92 2.0
6 Елена 90 3.0
3 Пётр 88 4.0
0 Анна 85 5.0
7 Дмитрий 82 6.0
2 Мария 78 7.0
5 Сергей 65 8.0Методы ранжирования
rank() поддерживает разные методы обработки одинаковых значений.
method=’average’ (по умолчанию)
При совпадающих значениях средний ранг:
# Данные с одинаковыми значениями
data = {
'Имя': ['Анна', 'Иван', 'Мария', 'Пётр'],
'Баллы': [85, 90, 85, 92]
}
df_rank = pd.DataFrame(data)
df_rank['Ранг_average'] = df_rank['Баллы'].rank(method='average')
print(df_rank)Результат:
Имя Баллы Ранг_average
0 Анна 85 1.5 # (1+2)/2
1 Иван 90 3.0
2 Мария 85 1.5 # (1+2)/2
3 Пётр 92 4.0method=’min’
df_rank['Ранг_min'] = df_rank['Баллы'].rank(method='min')
print(df_rank)Результат:
Имя Баллы Ранг_average Ранг_min
0 Анна 85 1.5 1.0
1 Иван 90 3.0 3.0
2 Мария 85 1.5 1.0
3 Пётр 92 4.0 4.0method=’max’
df_rank['Ранг_max'] = df_rank['Баллы'].rank(method='max')
print(df_rank)Результат:
Имя Баллы Ранг_average Ранг_min Ранг_max
0 Анна 85 1.5 1.0 2.0
1 Иван 90 3.0 3.0 3.0
2 Мария 85 1.5 1.0 2.0
3 Пётр 92 4.0 4.0 4.0method=’first’
df_rank['Ранг_first'] = df_rank['Баллы'].rank(method='first')
print(df_rank)Результат:
Имя Баллы ... Ранг_first
0 Анна 85 ... 1.0 # Первая в данных
1 Иван 90 ... 3.0
2 Мария 85 ... 2.0 # Вторая в данных
3 Пётр 92 ... 4.0method=’dense’
df_rank['Ранг_dense'] = df_rank['Баллы'].rank(method='dense')
print(df_rank)Результат:
Имя Баллы ... Ранг_dense
0 Анна 85 ... 1.0 # Пропусков нет
1 Иван 90 ... 3.0
2 Мария 85 ... 1.0
3 Пётр 92 ... 4.0Совет:
denseне пропускает ранги. Если два человека на 1-м месте, следующий будет на 2-м (а не на 3-м, как в других методах).
Сравнение методов ранжирования
| method | Описание | Пример: [85, 85, 90] |
|---|---|---|
average | Средний ранг | [1.5, 1.5, 3.0] |
min | Минимальный ранг | [1.0, 1.0, 3.0] |
max | Максимальный ранг | [2.0, 2.0, 3.0] |
first | По порядку в данных | [1.0, 2.0, 3.0] |
dense | Без пропусков | [1.0, 1.0, 2.0] |
Ранжирование с группировкой
# Ранжируем внутри каждой группы
df['Ранг_в_группе'] = df.groupby('Группа')['Баллы'].rank(ascending=False)
print(df[['Имя', 'Группа', 'Баллы', 'Ранг_в_группе']])Результат:
Имя Группа Баллы Ранг_в_группе
0 Анна А 85 1.0
1 Иван Б 92 2.0
2 Мария А 78 2.0
3 Пётр В 88 2.0
4 Ольга Б 95 1.0
5 Сергей А 65 3.0
6 Елена В 90 1.0
7 Дмитрий Б 82 3.0Совет: Ранжирование внутри групп полезно для сравнения в рамках одной категории (например, лучший студент в каждой группе).
Сортировка с пропусками (NaN)
# Добавляем пропуски
df_with_nan = pd.DataFrame({
'Имя': ['Анна', 'Иван', 'Мария', 'Пётр'],
'Баллы': [85, np.nan, 78, 92]
})
# Сортировка с NaN (по умолчанию NaN в конце)
print(df_with_nan.sort_values('Баллы'))Результат:
Имя Баллы
2 Мария 78.0
0 Анна 85.0
3 Пётр 92.0
1 Иван NaN# NaN в начале
print(df_with_nan.sort_values('Баллы', na_position='first'))Результат:
Имя Баллы
1 Иван NaN
2 Мария 78.0
0 Анна 85.0
3 Пётр 92.0Совет:
na_position='first'или'last'(по умолчанию) управляет положением пропусков.
Практический пример: топ-студенты
import pandas as pd
import numpy as np
np.random.seed(42)
# Данные о студентах
data = {
'Имя': ['Анна', 'Иван', 'Мария', 'Пётр', 'Ольга', 'Сергей', 'Елена', 'Дмитрий'],
'Группа': ['А', 'Б', 'А', 'В', 'Б', 'А', 'В', 'Б'],
'Баллы': [85, 92, 78, 88, 95, 65, 90, 82],
'Возраст': [20, 21, 19, 22, 20, 21, 19, 22]
}
df = pd.DataFrame(data)
print("=== 1. Топ-3 по баллам ===")
print(df.sort_values('Баллы', ascending=False).head(3))
print("\n=== 2. Сортировка по группе и баллам ===")
print(df.sort_values(['Группа', 'Баллы'], ascending=[True, False]))
print("\n=== 3. Ранжирование внутри групп ===")
df['Ранг_в_группе'] = df.groupby('Группа')['Баллы'].rank(ascending=False)
print(df[['Имя', 'Группа', 'Баллы', 'Ранг_в_группе']])
print("\n=== 4. Лучший в каждой группе ===")
best_in_group = df[df['Ранг_в_группе'] == 1]
print(best_in_group[['Имя', 'Группа', 'Баллы']])Результат:
=== 1. Топ-3 по баллам ===
Имя Группа Баллы Возраст
4 Ольга Б 95 20
1 Иван Б 92 21
6 Елена В 90 19
=== 2. Сортировка по группе и баллам ===
Имя Группа Баллы Возраст
0 Анна А 85 20
2 Мария А 78 19
5 Сергей А 65 21
4 Ольга Б 95 20
1 Иван Б 92 21
7 Дмитрий Б 82 22
6 Елена В 90 19
3 Пётр В 88 22
=== 3. Ранжирование внутри групп ===
Имя Группа Баллы Ранг_в_группе
0 Анна А 85 1.0
1 Иван Б 92 2.0
2 Мария А 78 2.0
3 Пётр В 88 2.0
4 Ольга Б 95 1.0
5 Сергей А 65 3.0
6 Елена В 90 1.0
7 Дмитрий Б 82 3.0
=== 4. Лучший в каждой группе ===
Имя Группа Баллы
0 Анна А 85
4 Ольга Б 95
6 Елена В 90Задачи для закрепления
Задача 1. Отсортируй DataFrame по колонке Баллы по возрастанию.
Задача 2. Отсортируй по колонкам Группа (по возрастанию) и Баллы (по убыванию).
Задача 3. Добавь колонку Ранг с ранжированием по баллам (по убыванию, метод average).
Задача 4. Найди топ-2 студента в каждой группе.
Задача 5. Отсортируй DataFrame по индексу.
Ответы:
Задача 1.
df.sort_values('Баллы')Задача 2.
df.sort_values(['Группа', 'Баллы'], ascending=[True, False])Задача 3.
df['Ранг'] = df['Баллы'].rank(ascending=False)Задача 4.
df['Ранг_в_группе'] = df.groupby('Группа')['Баллы'].rank(ascending=False)
top2 = df[df['Ранг_в_группе'] <= 2]Задача 5.
df.sort_index()Нюансы и подводные камни
Сортировка с разными типами
Если в колонке смешанные типы (числа и строки), sort_values() вызовет ошибку. Приводи все значения к одному типу.
Ранжирование с пропусками
rank() игнорирует NaN. Для заполнения пропусков используй fillna() перед ранжированием.
Производительность
Сортировка больших DataFrame (миллионы строк) может быть медленной. Используй индексы для ускорения.
Частые ошибки и как их избежать
Ошибка 1: Забыл ascending для нескольких колонок
# Ошибка: оба значения должны быть в списке
df.sort_values(['Кол1', 'Кол2'], ascending=[True]) # Ошибка
# Правильно: список из двух значений
df.sort_values(['Кол1', 'Кол2'], ascending=[True, False])Ошибка 2: Путаница между sort_values() и sort_index()
sort_values()— сортирует по значениям в колонкахsort_index()— сортирует по индексу
Ошибка 3: Неправильный method в rank()
# Метод 'average' по умолчанию
df['Ранг'] = df['Баллы'].rank()
# Другие методы
df['Ранг'] = df['Баллы'].rank(method='min')Шпаргалка
| Что нужно | Как пишется |
|---|---|
| Сортировка по колонке | df.sort_values('Колонка') |
| Сортировка по убыванию | df.sort_values('Колонка', ascending=False) |
| Сортировка по нескольким | df.sort_values(['К1', 'К2'], ascending=[True, False]) |
| Сортировка по индексу | df.sort_index() |
| Ранжирование | df['Ранг'] = df['Колонка'].rank() |
| Ранжирование по убыванию | df['Ранг'] = df['Колонка'].rank(ascending=False) |
| Методы ранжирования | rank(method='average'/'min'/'max'/'first'/'dense') |
| Ранжирование внутри групп | df.groupby('Группа')['Колонка'].rank() |
| Изменить исходный DataFrame | df.sort_values('Колонка', inplace=True) |
Заключение
Сегодня мы научились:
- Сортировать данные по одной и нескольким колонкам
- Сортировать по индексу
- Ранжировать значения с
rank() - Использовать разные методы ранжирования (average, min, max, first, dense)
- Ранжировать внутри групп






![Выбор колонок и строк: [] vs loc vs iloc](https://imi-ds.ru/wp-content/uploads/2026/08/vybor-kolonok-i-strok-vs-loc-vs-iloc-335x220.webp)

