Включите исполнение JavaScript в браузере, чтобы запустить приложение.
19 фев 2025

Как сортировать данные в Pandas

Библиотека Pandas для Python создана для упрощения работы с данными. В этой статье рассмотрим, как использовать библиотеку для сортировки, и приведем примеры.

Что такое Pandas 

Pandas — это открытая библиотека для Python, которая позволяет специалистам (в основном аналитикам данных/дата-сайентистам) работать с информацией: например, фильтровать, агрегировать и сортировать ее. Внутри себя Pandas содержит две структуры данных:

  • Series — это одномерный массив, который может состоять из элементов различных типов (например, строки/числа). Каждый элемент имеет индекс, который может быть числовым (по умолчанию) и строковым.

Пример создания Series:

import pandas as pd

# Здесь указываются строковые индексы — если не указывать их, то они будут проставлены

# автоматически (начиная с 0)

data_series = pd.Series([31, 28, 31, 30], index=['Январь', 'Февраль', 'Март', 'Апрель'])

data_series  # Вывод на экран
py

Результат будет выглядеть примерно так:

Январь31
Февраль28
Март31
Апрель30
  • DataFrame — двумерный массив, визуально похожий на таблицу, в которой элементы также могут быть разных типов, а столбцы и строки имеют свои индексы. 

Пример создания DataFrame:

data = {

    'Вид': ['Собака', 'Кошка', 'Собака', 'Попугай'],

    'Имя': ['Бусинка', 'Дуся', 'Шарик', 'Кеша'],

    'Возраст': [2, 4, 1, 15]

}

df = pd.DataFrame(data)

df  # Вывод на экран
py

Результат:

ВидИмяВозраст
СобакаБусинка2
КошкаДуся4
СобакаШарик1
ПопугайКеша15

Для доступа к элементам используются методы. iloc (для доступа по индексу начиная с 0)  и .loc (когда значение индекса, например, «Январь» известно):

# 1 — это индекс строки, а 2 — столбца

print(df.iloc[1, 2])

# Вывод: 4

# С помощью «:» выбираются все строки, далее выбираются столбцы

print(df.loc[:, ['Имя', 'Возраст']])
py

Результат:

ИмяВозраст
Бусинка2
Дуся4
Шарик1
Кеша15

Способы сортировки данных

В Pandas для сортировки используется метод sort_values(), его синтаксис выглядит следующим образом:

DataFrame.sort_values(by, *, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)
py

Рассмотрим каждый параметр метода:

  • by (обязательный) — принимает строку/список строк: имя или список имен столбцов, по которым будут сортироваться значения;
  • axis — принимает два аргумента: 0 (по умолчанию) или 1. Если передан 0, то данные будут сортироваться по столбцам, а если 1 — по значениям строк;
  • ascending — принимает два аргумента: True (по умолчанию) или False. При True результат упорядочивается по возрастанию, при False — по убыванию. Если в by передано несколько аргументов, то для каждого из них аргументы ascending могут быть разными;
  • inplace — также принимает True или False (по умолчанию). При True будет изменяться указанный DataFrame, при False будет создан новый объект;
  • kind — определяет алгоритм сортировки: quicksort (по умолчанию), mergesort, heapsort, stable;
  • na_position — определяет, где будут расположены NaN-значения: если передано last (по умолчанию), то в конце, а если first — в начале;
  • ignore_index — принимает True или False (по умолчанию). При False индексы сохраняются, при True заменяются на 0, 1, 2 и так далее;
  • key — принимает функцию, которую нужно предварительно применить к значениям (по умолчанию None — функция не указана).

Также существует метод sort_index() — он сортирует значения по индексам. Синтаксис метода:

DataFrame.sort_index(*, axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, ignore_index=False, key=None)
py

Здесь появилось два новых параметра:

  • level — определяет уровень индекса, принимает целое число, или список чисел, или строку (имя индекса), или список строк;
  • sort_remaining — принимает True (по умолчанию) или False. При True сортировка будет проводиться по всем уровням (после того как она проведена по указанному), при False — только по указанному.

Примеры использования сортировки данных

Для того чтобы рассмотреть примеры, создадим исходную таблицу с информацией о студентах (то есть создадим DataFrame): 

import pandas as pd

data = {

    'Имя': ['Анна', 'Виктор', 'Виталий', 'Дарья', 'Елена'],

    'Возраст': [23, 21, 22, 23, 22],

    'Оценка': [88, 95, 70, 85, 91],

    'Город': ['Москва', 'Санкт-Петербург', 'Новосибирск', 'Москва', 'Новосибирск']

}

students_df = pd.DataFrame(data)
py

Она будет выглядеть следующим образом (столбца «Индекс» в таблице нет, здесь он добавлен для лучшего понимания примеров):

ИндексИмяВозрастОценкаГород
0Анна2388Москва
1Виктор2195Санкт-Петербург
2Виталий2270Новосибирск
3Дарья2385Москва
4Елена2291Новосибирск

Начнем с простого — отсортируем таблицу по оценкам:

students_df.sort_values(by='Оценка')
py

Итог:

ИмяВозрастОценкаГород
Виталий2270Новосибирск
Дарья2385Москва
Анна2388Москва
Елена2291Новосибирск
Виктор2195Санкт-Петербург

По умолчанию ascending=True, поэтому значения отсортированы по возрастанию. Изменяем значение этого параметра:

students_df.sort_values(by='Оценка', ascending=False)
py

получаем результат:

ИмяВозрастОценкаГород
Виктор2195Санкт-Петербург
Елена2291Новосибирск
Анна2388Москва
Дарья2385Москва
Виталий2270Новосибирск

Далее можно отсортировать таблицу по возрасту и оценке, при этом возраст — по возрастанию, а оценки — по убыванию:

students_df.sort_values(by=['Возраст', 'Оценка'], ascending=[True, False])
py

Результат:

ИмяВозрастОценкаГород
Виктор2195Санкт-Петербург
Елена2291Новосибирск
Виталий2270Новосибирск
Анна2388Москва
Дарья2385Москва

Можно заметить, что студент с оценкой 70 оказался в середине таблицы, хотя должен был оказаться внизу. Так произошло из-за того, что первым столбцом в by указан возраст, а значит, в первую очередь данные сортируются именно по нему.

Чтобы рассмотреть работу параметра na_position, сделаем копию таблицы и изменим одно из значений на None:

students_df_with_nan = students_df.copy()

# Изменение значения в строке с индексом 2 и столбце «Оценка»

students_df_with_nan.loc[2, 'Оценка'] = None  
py

Теперь оценка Виталия не указана, отсортируем таблицу по оценкам, помещая NaN-значения в начало:

students_df_with_nan.sort_values(by='Оценка', na_position='first')
py

Результат:

ИмяВозрастОценкаГород
Виталий22NaNНовосибирск
Дарья2385Москва
Анна2388Москва
Елена2291Новосибирск
Виктор2195Санкт-Петербург

Каждая строка исходной таблицы имеет индекс (первая строка — индекс 0, вторая — 1 и так далее). Во всех примерах выше эти индексы сохранялись, но при необходимости это можно изменить:

students_df.sort_values(by='Оценка', ascending=False, ignore_index=True)
py

Результат (столбец с индексами добавлен для иллюстрации работы параметра ignore_index):

ИндексИмяВозрастОценкаГород
0Виктор2195Санкт-Петербург
1Елена2291Новосибирск
2Анна2388Москва
3Дарья2385Москва
4Виталий2270Новосибирск

Далее рассмотрим работу параметра key: в исходной таблице данные уже нормализованы, однако так бывает не всегда — например, некоторые имена могут быть записаны с маленькой буквы:

students_df_with_nan = students_df.copy()

students_df_with_nan.loc[2, 'Имя'] = 'виталий'
py

В таком случае можно отсортировать данные без учета регистра:

students_df_with_nan.sort_values(by='Имя', key=lambda col: col.str.lower())
py

В результате таблица будет отсортирована по именам (по алфавиту):

ИмяВозрастОценкаГород
Анна2388Москва
Виктор2195Санкт-Петербург
виталий2270Новосибирск
Дарья2385Москва
Елена2291Новосибирск

Сортировка по индексам (метод sort_index()) работает подобным образом. Например, чтобы отсортировать таблицу по индексам по возрастанию, достаточно написать следующий код:

students_df.sort_index()
py

Если изменить значение ascending на False:

students_df.sort_index(ascending=False)
py

то в результате вернется «перевернутая» таблица:

ИмяВозрастОценкаГород
Елена2291Новосибирск
Дарья2385Москва
Виталий22NaNНовосибирск
Виктор2195Санкт-Петербург
Анна2388Москва

Главное

  • Pandas — это библиотека для Python, которая содержит две структуры данных: Series и DataFrame.
  • Для доступа к элементам используются методы. loc и .iloc.
  • Существует два основных метода для сортировки: sort_values() (по значениям) и sort_index() (по индексам).