Функция Pandas df.sort_values()
df.sort_values()Это функция в Pandas, используемая для сортировки данных DataFrame по одному или нескольким столбцам.
Сортировка — это базовая операция в анализе данных, которая помогает лучше понять данные и обнаружить закономерности.sort_values()Она поддерживает сортировку по одному или нескольким столбцам, по возрастанию или убыванию, а также может обрабатывать пропущенные значения. Это незаменимый инструмент при обработке данных.
Базовый синтаксис и параметры
sort_values()Это функция-член DataFrame, вызываемая через оператор точки.для вызова.
Формат синтаксиса
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)
Описание параметра
| Параметр | Type | Обязательно? | Описание | Значение по умолчанию |
|---|---|---|---|---|
| от | str или список str | Обязательный | Указывает имя (имена) столбцов, используемых для сортировки. Если это список, сортировка выполняется в соответствии с порядком в списке. | Отсутствует |
| axis | int или str | Optional | Указывает ось для сортировки.0или'index'0 означает сортировку по столбцам (по умолчанию);1или'columns'1 означает сортировку по строкам. |
0 |
| ascending | bool или список bool | Optional | Задаёт порядок сортировки.TrueTrue означает сортировку по возрастанию (от меньшего к большему);FalseFalse означает сортировку по убыванию (от большего к меньшему). Если это список, он взаимно однозначно соответствуетbyстолбцам в параметре 'by'. |
True |
| inplace | bool | Optional | Если TrueTrue, то он изменяет исходный DataFrame напрямую и не возвращает новый объект; если FalseFalse, то возвращается новый DataFrame, а исходные данные остаются неизменными. |
False |
| kind | str | Optional | Задаёт алгоритм сортировки.'quicksort''quicksort' (быстрая сортировка),'mergesort''mergesort' (сортировка слиянием),'heapsort''heapsort' (пирамидальная сортировка),'stable''stable' (устойчивая сортировка). |
'quicksort' |
| na_position | str | Optional | Указывает позицию пропущенных значений (NaN).'first''first' означает размещение в начале;'last''last' означает размещение в конце. |
'last' |
| ignore_index | bool | Optional | Если TrueTrue, он сбрасывает индекс отсортированного результата, нумеруя с 0; если FalseFalse, он сохраняет исходный индекс. |
False |
| key | вызываемый объект | Optional | Применяет функцию к данным перед сортировкой, обычно используется для пользовательских правил сортировки. | Отсутствует |
Описание возвращаемого значения
- Возвращает новый DataFrame (если
inplace=False), илиNone(еслиinplace=True)。 - возвращённый DataFrame отсортирован в соответствии с указанными правилами.
Примеры
Давайте тщательно освоимsort_values()использование df.sort_values().
Пример 1: Сортировка по одному столбцу по возрастанию
Простейший вариант использования — сортировка по возрастанию значений столбца.
Пример
# Создание DataFrame с оценками студентов
data = {
'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Zhao Liu', 'Qian Qi'],
Математика: [85, 92, 78, 90, 88],
Английский: [90, 85, 92, 88, 78]
}
df = pd.DataFrame(data)
print(“Исходные данные:”)
print(df)
print("=" * 50)
# Сортировка по возрастанию по баллам за математику
df_sorted = df.sort_values(by=Mathematics)
print(После сортировки по баллам за математику по возрастанию:)
print(df_sorted)
Ожидаемый вывод:
原始数据: 姓名 数学 英语 0 张三 85 90 1 李四 92 85 2 王五 78 92 3 赵六 90 88 4 钱七 88 78 ================================================== 按数学成绩升序排序后: 姓名 数学 英语 2 王五 78 92 0 张三 85 90 4 钱七 88 78 3 赵六 90 88 1 李四 92 85
Пояснение к коду:
- Порядок сортировки по умолчанию — по возрастанию (от меньшего к большему).
- Балл по математике 78 стоит первым, а 92 — последним.
- После сортировки индекс остаётся неизменным (2, 0, 4, 3, 1).
Пример 2: Сортировка по одному столбцу по убыванию
Используйтеascending=Falseчтобы выполнить сортировку по убыванию.
Пример
# Создание DataFrame с оценками студентов
data = {
'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Zhao Liu', 'Qian Qi'],
Математика: [85, 92, 78, 90, 88],
Английский: [90, 85, 92, 88, 78]
}
df = pd.DataFrame(data)
print(“Исходные данные:”)
print(df)
print("=" * 50)
# Сортировка по убыванию по баллам за математику
df_sorted = df.sort_values(by=Mathematics, ascending=False)
print(После сортировки по баллам за математику в порядке убывания:)
print(df_sorted)
Ожидаемый вывод:
原始数据: 姓名 数学 英语 0 张三 85 90 1 李四 92 85 2 王五 78 92 3 赵六 90 88 4 钱七 88 78 ================================================== 按数学成绩降序排序后: 姓名 数学 英语 1 李四 92 85 3 赵六 90 88 4 钱七 88 78 0 张三 85 90 2 王五 78 92
Пояснение к коду:
- Используйте
ascending=Falseможно выполнить сортировку по убыванию от большего к меньшему. - Балл Ли Сы по математике 92 стоит первым.
Пример 3: Сортировка по нескольким столбцам
Можно сортировать по нескольким столбцам: сначала по первому столбцу, а если значения первого столбца совпадают, то по второму столбцу.
Пример
# Создание DataFrame с оценками студентов
data = {
'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Zhao Liu', 'Qian Qi'],
Класс: [Класс 1, Класс 2, Класс 1, Класс 2, Класс 1],
Математика: [85, 92, 78, 90, 88]
}
df = pd.DataFrame(data)
print(“Исходные данные:”)
print(df)
print("=" * 50)
# Сначала сортировка по классу, затем по баллам за математику (в обоих случаях по возрастанию)
df_sorted = df.sort_values(by=[Class, Mathematics])
print("После сортировки сначала по классу, затем по баллам за математику:")
print(df_sorted)
print("=" * 50)
# Сортировка по классу по возрастанию, по баллам за математику по убыванию
df_sorted2 = df.sort_values(by=[Class, Mathematics], ascending=[True, False])
print(Сортировка по классу по возрастанию, по баллам за математику по убыванию:)
print(df_sorted2)
Ожидаемый вывод:
原始数据: 姓名 班级 数学 0 张三 一班 85 1 李四 二班 92 2 王五 一班 78 3 赵六 二班 90 4 钱七 一班 88 ================================================== 先按班级,再按数学成绩排序后: 姓名 班级 数学 2 王五 一班 78 0 张三 一班 85 4 钱七 一班 88 3 赵六 二班 90 1 李四 二班 92 ================================================== 按班级升序,数学成绩降序: 姓名 班级 数学 4 钱七 一班 88 0 张三 一班 85 2 王五 一班 78 1 李四 二班 92 3 赵六 二班 90
Пояснение к коду:
- Используйте список
by=['班级', '数学']для сортировки по нескольким столбцам. - Сначала сортируйте по "class", чтобы Class 1 был впереди, а Class 2 — позади.
- Внутри одного класса дополнительно сортируйте по баллам за "math".
- Используйте
ascending=[True, False]чтобы указать разные направления сортировки для разных столбцов.
Пример 4: Сортировка с пропущенными значениями
Используйтеna_positionпараметр для управления положением пропущенных значений.
Пример
import numpy as np
# Создайте DataFrame с пропущенными значениями
data = {
'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Чжао Лю'],
'Score': [85, np.nan, 92, 78]
}
df = pd.DataFrame(data)
print(“Исходные данные:”)
print(df)
print("=" * 50)
# По умолчанию: пропущенные значения размещаются в конце
df_sorted_last = df.sort_values(by='Score')
print("Пропущенные значения размещены в конце:")
print(df_sorted_last)
print("=" * 50)
# Поместить пропущенные значения первыми
df_sorted_first = df.sort_values(by='Score', na_position='first')
print("Пропущенные значения размещены в начале:")
print(df_sorted_first)
Ожидаемый вывод:
原始数据: 姓名 成绩 0 张三 85.0 1 李四 NaN 2 王五 92.0 3 赵六 78.0 ================================================== 缺失值放在最后: 姓名 成绩 3 赵六 78.0 0 张三 85.0 2 王五 92.0 1 李四 NaN ================================================== 缺失值放在最前: 姓名 成绩 1 李四 NaN 3 赵六 78.0 0 张三 85.0 2 王五 92.0
Пояснение к коду:
- По умолчанию (
na_position='last'), пропущенные значения размещаются последними. - Set
na_position='first', и пропущенные значения размещаются первыми.
Пример 5: Сброс индекса после сортировки
После сортировки индекс может стать не непрерывным; можно использоватьignore_index=Trueчтобы сбросить индекс.
Пример
# Создать DataFrame
data = {
'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У'],
'Score': [85, 92, 78]
}
df = pd.DataFrame(data)
print(“Исходные данные:”)
print(df)
print("=" * 50)
# Сортировка без сброса индекса
df_sorted = df.sort_values(by='Score')
print(После сортировки (с сохранением исходных индексов):)
print(df_sorted)
print("=" * 50)
# Сортировка и сброс индекса
df_sorted_reset = df.sort_values(by='Score', ignore_index=True)
print(После сортировки (индекс сброшен):)
print(df_sorted_reset)
Ожидаемый вывод:
原始数据: 姓名 成绩 0 张三 85 1 李四 92 2 王五 78 ================================================== 排序后(保留原始索引): 姓名 成绩 2 王五 78 0 张三 85 1 李四 92 ================================================== 排序后(重置索引): 姓名 成绩 0 王五 78 1 张三 85 2 李四 92
Пояснение к коду:
- Использование
ignore_index=Trueзатем индекс перенумеровывается, начиная с 0. - Это удобнее, когда позже нужно обращаться к данным по индексу.
Пример 6: Пользовательская сортировка с использованием параметра key
keyЭтот параметр позволяет применить пользовательскую функцию к данным перед сортировкой.
Пример
# Создание DataFrame, содержащего смесь строк в верхнем и нижнем регистре
data = {
'Word': ['apple', 'Banana', 'cherry', 'APPLE', 'banana']
}
df = pd.DataFrame(data)
print(Исходные данные:)
print(df)
print("=" * 50)
# Сортировка по алфавиту по возрастанию (с учётом регистра)
df_sorted_case = df.sort_values(by='Word')
print(По алфавиту по возрастанию (с учётом регистра):)
print(df_sorted_case)
print("=" * 50)
# Используйте параметр key для сортировки без учёта регистра
df_sorted_nocase = df.sort_values(by='Word', key=lambda x: x.str.lower())
print(По алфавиту по возрастанию (без учёта регистра):)
print(df_sorted_nocase)
Ожидаемый вывод:
原始数据:
单词
0 apple
1 Banana
2 cherry
3 APPLE
4 banana
==================================================
按字母升序(区分大小写):
单词
3 APPLE
0 apple
1 Banana
4 banana
2 cherry
==================================================
按字母升序(不区分大小写):
单词
0 apple
3 APPLE
1 Banana
4 banana
2 cherry
Пояснение к коду:
- По умолчанию сортировка учитывает регистр: заглавные буквы ставятся перед строчными.
- Использование
key=lambda x: x.str.lower()все строки преобразуются в нижний регистр перед сортировкой, что обеспечивает сортировку без учёта регистра.
Пример 7: изменение на месте с использованием параметра inplace
Использованиеinplace=Trueможно изменять непосредственно исходный DataFrame.
Пример
# Создать DataFrame
data = {
'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У'],
'Score': [85, 92, 78]
}
df = pd.DataFrame(data)
print(Исходные данные:)
print(df)
print(fID исходных данных: {id(df)})
print("=" * 50)
# Сортировка на месте с использованием inplace=True
df.sort_values(by='Score', inplace=True)
print(После сортировки с inplace=True:)
print(df)
print(fID отсортированных данных: {id(df)})
Ожидаемый вывод:
原始数据: 姓名 成绩 0 张三 85 1 李四 92 2 王五 78 原始数据 id: 140234567890 ================================================== 使用 inplace=True 排序后: 姓名 成绩 2 王五 78 0 张三 85 1 李四 92 排序后数据 id: 140234567890 # 同一个对象
Пояснение к коду:
- Использование
inplace=Trueпосле этого изменяется сам DataFrame, и новый объект не возвращается. - ID до и после сортировки
idсовпадают, что указывает на то, что это один и тот же объект. - Этот метод может экономить память, но он изменяет исходные данные.
Примечания
sort_values()По умолчанию возвращается новый DataFrame, а исходные данные не изменяются. Чтобы изменить на месте, используйтеinplace=Trueпараметр.- Операция сортировки не выполняется на месте (если не указано
inplace=True), исходный DataFrame остаётся неизменным. - Использование
ignore_index=Trueможет сбросить индекс, что более удобно при последующей обработке данных. keyПараметр очень мощный и позволяет реализовать различные пользовательские сортировки, например без учёта регистра, сортировку по абсолютному значению и т. д.- При сортировке по нескольким столбцам,
ascendingпараметр может быть списком, который соответствует один к одномуbyстолбцам в ...
Другие расширения
Pandas: общие функции