Сортировка и ранжирование

Сортировка и ранжирование Pandas

Привет! Ты уже умеешь загружать данные, фильтровать, группировать и агрегировать. Но часто нужно упорядочить данные: показать топ-10 продаж, отсортировать студентов по баллам или просто расположить данные в хронологическом порядке. Для этого в Pandas есть инструменты сортировки и ранжирования.

В этой статье мы разберём:

  • Сортировка по одной колонке: sort_values()
  • Сортировка по нескольким колонкам
  • Сортировка по индексу: sort_index()
  • Ранжирование значений: rank()
  • Разные методы ранжирования (average, min, max, first, dense)

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный 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.0

method=’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.0

method=’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.0

method=’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.0

method=’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()
Изменить исходный DataFramedf.sort_values('Колонка', inplace=True)

Заключение

Сегодня мы научились:

  • Сортировать данные по одной и нескольким колонкам
  • Сортировать по индексу
  • Ранжировать значения с rank()
  • Использовать разные методы ранжирования (average, min, max, first, dense)
  • Ранжировать внутри групп

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×