Функция Pandas df.sort_values()

Pandas 常用函数Pandas: общие функции


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: Сортировка по одному столбцу по возрастанию

Простейший вариант использования — сортировка по возрастанию значений столбца.

Пример

import pandas as pd

# Создание 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

Пояснение к коду:

  1. Порядок сортировки по умолчанию — по возрастанию (от меньшего к большему).
  2. Балл по математике 78 стоит первым, а 92 — последним.
  3. После сортировки индекс остаётся неизменным (2, 0, 4, 3, 1).

Пример 2: Сортировка по одному столбцу по убыванию

Используйтеascending=Falseчтобы выполнить сортировку по убыванию.

Пример

import pandas as pd

# Создание 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: Сортировка по нескольким столбцам

Можно сортировать по нескольким столбцам: сначала по первому столбцу, а если значения первого столбца совпадают, то по второму столбцу.

Пример

import pandas as pd

# Создание 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 pandas as pd
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'), пропущенные значения размещаются последними.
  • Setna_position='first', и пропущенные значения размещаются первыми.

Пример 5: Сброс индекса после сортировки

После сортировки индекс может стать не непрерывным; можно использоватьignore_index=Trueчтобы сбросить индекс.

Пример

import pandas as pd

# Создать 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Этот параметр позволяет применить пользовательскую функцию к данным перед сортировкой.

Пример

import pandas as pd

# Создание 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.

Пример

import pandas as pd

# Создать 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 常用函数Распространённые функции Pandas

Другие расширения