Сортировка колонок в Python: практические решения

Раздел: Обработка данных -> Работа с таблицами

Сортировка столбца в Python

Как отсортировать таблицу по значениям одного столбца с помощью pandas?

Наиболее эффективное и распространенное решение для сортировки столбца в Python - использование библиотеки pandas и метода sort_values. Этот метод применяется к DataFrame и позволяет упорядочить строки по указанному столбцу.


import pandas as pd

# Создаем простую таблицу
data = {'Имя': ['Анна', 'Борис', 'Виктор', 'Глеб'],
        'Возраст': [25, 30, 22, 35],
        'Зарплата': [50000, 60000, 45000, 70000]}
df = pd.DataFrame(data)

# Сортировка по столбцу 'Возраст' по возрастанию
df_sorted = df.sort_values(by='Возраст')
print(df_sorted)

библиотека таблиц python (библиотека для работы с таблицами в python)

      Имя  Возраст  Зарплата
2  Виктор       22     45000
0     Анна       25     50000
1    Борис       30     60000
3     Глеб       35     70000

Python вывести таблицу (вывод таблицы в python)

Пояснения:

  • Метод sort_values принимает параметр by, в котором указывается имя столбца (или список столбцов).
  • По умолчанию сортировка выполняется по возрастанию. Чтобы отсортировать по убыванию, используется ascending=False.
  • Результат возвращает новый DataFrame, исходный не изменяется. Для изменения на месте применяется inplace=True.

Типичные ошибки и способы их решения:

  • KeyError - столбец не найден. Проверьте имя столбца, возможно опечатка. Используйте df.columns для просмотра.
  • TypeError - несоответствие типов данных (например, смесь строк и чисел). Приведите столбец к единому типу через astype или удалите/замените некорректные значения.
  • Обработка пропущенных значений: по умолчанию NaN помещаются в конец. Изменить поведение можно параметром na_position ('first' или 'last').

Как отсортировать список списков по одному столбцу без pandas?

Если нет возможности использовать pandas, можно воспользоваться встроенной функцией sorted с ключевой функцией itemgetter из модуля operator или lambda-выражением.


from operator import itemgetter

data = [['Анна', 25, 50000],
        ['Борис', 30, 60000],
        ['Виктор', 22, 45000],
        ['Глеб', 35, 70000]]

# Сортировка по второму столбцу (индекс 1) по возрастанию
sorted_data = sorted(data, key=itemgetter(1))
print(sorted_data)

таблица python задача (задача на таблицу в python)

[['Виктор', 22, 45000], ['Анна', 25, 50000], ['Борис', 30, 60000], ['Глеб', 35, 70000]]

Python работа с таблицами (работа с таблицами в python)

Пояснения:

  • Функция sorted возвращает новый список, не изменяя исходный.
  • Параметр key принимает функцию, которая извлекает значение для сравнения. itemgetter(i) возвращает элемент с индексом i.
  • Для сортировки по убыванию добавьте reverse=True.

Возможные проблемы:

  • При смешанных типах данных в столбце (например, числа и строки) возникнет TypeError. Решение - предварительно привести все элементы столбца к одному типу или исключить неподходящие строки.
  • Если сортируемый столбец содержит нечисловые типы (даты, строки), убедитесь, что они сравнимы между собой.

Как отсортировать столбец в массиве NumPy?

Для массивов NumPy используется метод argsort, который возвращает индексы сортировки, а затем эти индексы применяются к массиву.


import numpy as np

arr = np.array([[25, 50000, 'Анна'],
                [30, 60000, 'Борис'],
                [22, 45000, 'Виктор'],
                [35, 70000, 'Глеб']])

# Сортировка по первому столбцу (возраст)
indices = arr[:, 0].argsort()
sorted_arr = arr[indices]
print(sorted_arr)

Python создание таблиц (создание таблиц в python)

[['22' '45000' 'Виктор']
 ['25' '50000' 'Анна']
 ['30' '60000' 'Борис']
 ['35' '70000' 'Глеб']]

сортировка столбца python (сортировка столбца в python)

Пояснения:

  • arr[:, 0] - извлекаем первый столбец.
  • argsort() возвращает массив индексов, которые бы отсортировали этот столбец по возрастанию.
  • Используя индексацию arr[indices], получаем отсортированный массив.
  • Для сортировки по убыванию можно использовать arr[:, 0].argsort()[::-1].

Особенности:

  • Метод argsort работает только с числовыми массивами. Если столбец содержит строки, его нужно предварительно преобразовать в числовой вид или использовать другие методы (например, np.lexsort).
  • Изменение порядка строк происходит по всему массиву, поэтому важно, чтобы столбцы были согласованы.

Как отсортировать столбец с учетом пользовательского порядка (не по алфавиту)?

Иногда требуется сортировка не по алфавиту, а по заданному порядку категорий. Для этого можно создать словарь отображения и использовать его как ключ.


data = {'Город': ['Москва', 'Питер', 'Казань', 'Новосибирск'],
        'Население': [12678079, 5383890, 1257341, 1625631]}
df = pd.DataFrame(data)

# Задаем пользовательский порядок
city_order = {'Москва': 1, 'Питер': 2, 'Новосибирск': 3, 'Казань': 4}
df['order'] = df['Город'].map(city_order)
df_sorted = df.sort_values('order').drop('order', axis=1)
print(df_sorted)

Python столбец таблицы (столбец таблицы в python)

        Город  Население
0      Москва   12678079
1       Питер    5383890
3  Новосибирск    1625631
2      Казань    1257341

Пояснения:

  • Создается вспомогательный столбец order с числовым рангом.
  • После сортировки вспомогательный столбец удаляется.

Проблемы:

  • Если в столбце есть значения, не попавшие в словарь, они получат NaN. Для решения можно установить значение по умолчанию через map с параметром na_action или использовать fillna.
  • При большом количестве уникальных значений словарь может быть громоздким.
- Python таблица ввода (таблица ввода в python)
- Python таблица данных (таблица данных в python)
- Python таблица значений (таблица значений в python)

Дополнительные примеры сортировки столбцов

В этом разделе представлены нестандартные сценарии сортировки столбцов с подробными комментариями.

Сортировка по нескольким столбцам с разными направлениями

Часто требуется отсортировать сначала по одному столбцу, затем по другому с разным порядком (например, по возрасту по возрастанию, а при равном возрасте - по зарплате по убыванию).

Пример

import pandas as pd

data = {'Имя': ['Анна', 'Борис', 'Виктор', 'Глеб', 'Дмитрий'],
        'Отдел': ['IT', 'HR', 'IT', 'HR', 'IT'],
        'Возраст': [25, 30, 22, 30, 22],
        'Зарплата': [50000, 60000, 45000, 65000, 47000]}
df = pd.DataFrame(data)

df_sorted = df.sort_values(by=['Возраст', 'Зарплата'], ascending=[True, False])
print(df_sorted)
       Имя Отдел  Возраст  Зарплата
2  Виктор    IT       22     45000
4  Дмитрий    IT       22     47000
0     Анна    IT       25     50000
1    Борис    HR       30     60000
3     Глеб    HR       30     65000

В данном примере строки сортируются сначала по возрасту (по возрастанию), при одинаковом возрасте - по зарплате (по убыванию). Это достигается передачей списка в параметр by и списка булевых значений в ascending.

Стабильная сортировка и сохранение исходного порядка равных элементов

По умолчанию sort_values использует стабильную сортировку (алгоритм TimSort), поэтому равные элементы сохраняют свой исходный порядок. Это может быть важно при последовательной сортировке.

Пример

# Продолжаем предыдущий пример: при сортировке только по возрасту
# порядок людей с возрастом 22 сохраняется как в исходных данных
df_age = df.sort_values('Возраст')
print(df_age)
       Имя Отдел  Возраст  Зарплата
2  Виктор    IT       22     45000
4  Дмитрий    IT       22     47000
0     Анна    IT       25     50000
1    Борис    HR       30     60000
3     Глеб    HR       30     65000

Видно, что "Виктор" (строка с индексом 2) стоит раньше "Дмитрия" (индекс 4) при равных возрастах, так как в исходном DataFrame он был выше.

Сортировка с пользовательской функцией сравнения через key

В pandas sort_values не поддерживает пользовательскую функцию сравнения напрямую. Однако можно создать временный столбец на основе ключа и отсортировать по нему.

Пример

import pandas as pd

df = pd.DataFrame({'fruit': ['apple', 'banana', 'cherry', 'date', 'elderberry'],
                   'count': [3, 2, 5, 4, 1]})

# Сортировка по длине названия фрукта
df['len_name'] = df['fruit'].str.len()
df_sorted = df.sort_values('len_name').drop('len_name', axis=1)
print(df_sorted)
        fruit  count
0       apple      3
1      banana      2
3        date      4
2      cherry      5
4  elderberry      1

Также можно использовать key в sorted для обычных списков, но для DataFrame этот подход через временный столбец проще.

Обработка пропущенных значений при сортировке

Параметр na_position управляет расположением строк с NaN. По умолчанию они помещаются в конец, но можно вывести их в начало.

Пример

import pandas as pd
import numpy as np

df = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie', 'David'],
                   'score': [90, np.nan, 85, np.nan]})

print("Сортировка с NaN в конце:")
print(df.sort_values('score'))
print("\nСортировка с NaN в начале:")
print(df.sort_values('score', na_position='first'))
Сортировка с NaN в конце:
      name  score
2  Charlie   85.0
0    Alice   90.0
1      Bob    NaN
3    David    NaN

Сортировка с NaN в начале:
      name  score
1      Bob    NaN
3    David    NaN
2  Charlie   85.0
0    Alice   90.0

Сортировка столбца с разными типами данных в списке списков

При сортировке смешанных типов (например, число и строка) может возникнуть ошибка. Решение - использовать функцию, которая нормализует типы.

Пример

data = [['A', 3], ['B', 2.5], ['C', '10'], ['D', 1]]
def safe_sort_key(item):
    val = item[1]
    try:
        return float(val)
    except (ValueError, TypeError):
        # Если не удается преобразовать, помещаем в конец или обрабатываем
        return float('inf')  # или 0, в зависимости от логики

sorted_data = sorted(data, key=safe_sort_key)
print(sorted_data)
[['D', 1], ['B', 2.5], ['A', 3], ['C', '10']]

Здесь функция safe_sort_key пытается привести значение к float, а если не получается, возвращает бесконечность, чтобы такие элементы оказались в конце. Можно адаптировать под конкретные требования.

Сортировка столбца с игнорированием регистра строк

Для сортировки строк без учета регистра используют преобразование к нижнему регистру или использование key=str.lower.

Пример

import pandas as pd

df = pd.DataFrame({'word': ['Apple', 'banana', 'Cherry', 'date']})
df_sorted = df.sort_values('word', key=lambda col: col.str.lower())
print(df_sorted)
    word
0  Apple
1  banana
2  Cherry
3  date

Параметр key в sort_values принимает функцию-преобразователь для всего столбца. Здесь применяется str.lower ко всем элементам перед сравнением.

Сортировка столбца в Python - comments

En
сортировка столбца python (python)