Самые быстрые способы сортировки значений Pandas DataFrame

Оглавление

Pandas - популярная библиотека с открытым исходным кодом , используемая для анализа данных. Она написана на языке Python и имеет весьма амбициозную задачу. Согласно собственному описанию на GitHub, Pandas "стремится стать фундаментальным высокоуровневым строительным блоком для выполнения практического, реального анализа данных на Python". Кроме того, он ставит перед собой более широкую цель - стать самым мощным и гибким инструментом анализа/манипулирования данными с открытым исходным кодом, доступным на любом языке"

Важным компонентом Pandas является DataFrame - наиболее часто используемый объект Pandas.

Как правило, специалистам по науке о данных часто приходится выполнять различные операции по проектированию данных, такие как агрегирование, сортировка и фильтрация данных. Цель данной статьи - помочь типичному специалисту в области науки о данных выполнить сортировку значений в Pandas DataFrame.

Я рассмотрю семь распространенных вариантов использования, а также более подробно остановлюсь на параметрах, связанных с двумя основными функциями сортировки. Таким образом, если вам потребуется выполнить сортировку, выходящую за рамки семи распространенных вариантов использования, вы будете лучше подготовлены к адаптации.

Две основные функции сортировки

Pandas имеет две ключевые функции сортировки: sort_values и sort_index. Для получения подробной информации о параметрах и sort_index можно обратиться к API для sort_values в документации Pandas.

  • sort_values(): Используется для сортировки кадра данных Pandas по одному или нескольким столбцам.
  • sort_index(): Используется для сортировки Pandas DataFrame по индексу строки.

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

Позвольте мне более наглядно объяснить различия между двумя функциями сортировки. sort_values проще для понимания. Представьте, что у вас есть DataFrame, который выглядит следующим образом:

Date/Time                | Weather
------------------|------------
2012-01-01 00:00:00  | Fog
2012-01-01 01:00:00  | Fog
2012-01-01 02:00:00  | Freezing Drizzle,Fog

Если требуется отсортировать DataFrame по столбцу Weather, то используется

 Аналогично, sort_values если требуется отсортировать кадр данных по значениям одного или нескольких столбцов, также следует использовать sort_values.

Сортировка по меткам DataFrame

В отличие от него, sort_index не указывает на свое значение так явно, как это следует из его названия. Важно знать, что Pandas DataFrame позволяет указать, какой столбец является индексом строки . Если же вы не указали конкретный столбец в качестве индекса строки, Pandas по умолчанию создаст индекс строки, основанный на нулевом значении.

Поэтому, выполняя команду sort_index, вы сортируете DataFrame по индексу строки.

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

Теперь, когда я представил две основные функции сортировки, перейдем к рассмотрению семи распространенных случаев использования сортировки в Pandas DataFrame. Для упрощения все приведенные здесь примеры будут демонстрироваться на примере открытого набора данных. Я подготовил набор данных, используя следующий код:

import pandas as pd

# repo for data https://github.com/jvns/pandas-cookbook/tree/master/data
data_url = 'https://raw.githubusercontent.com/jvns/pandas-cookbook/master/data/weather_2012.csv'

# read data from url as pandas dataframe
weather = pd.read_csv(data_url)

# print the first three rows
print(weather.head(n=3))
You should expect the following result:
  Date/Time           ... Weather
0 2012-01-01 00:00:00 ... Fog
1 2012-01-01 01:00:00 ... Fog
2 2012-01-01 02:00:00 ... Freezing Drizzle,Fog

[3 rows x 8 columns]

Вы должны ожидать следующего результата:

Обратите внимание, что столбцы 0, 1 и 2 являются индексами строк, которые я рассматривал ранее. Если вы откроете исходные данные (которые на самом деле являются CSV-файлом) напрямую, то поймете, что первый столбец - это дата/время. Помните, я объяснял, как sort_index сортирует DataFrame по индексу строки? В наборе результатов, который вы видите выше, индекс строки генерируется автоматически и выглядит следующим образом.

Теперь приступим к рассмотрению первого общего случая использования.

Случай использования №1: Сортировка по значениям одного столбца

Наиболее часто используется сортировка по возрастанию значений одного столбца. Поэтому давайте сделаем именно это с подготовленным набором данных. Предположим, что мы хотим отсортировать тестовые данные по столбцу Weather в порядке возрастания:

sort_by_weather = weather.sort_values('Weather')
print(sort_by_weather.head(n=3))

Мы можем ожидать следующего результата:

     Date/Time           Temp (C)  ... Stn Press (kPa) Weather
7103 2012-10-22 23:00:00 6.4       ... 101.34          Clear
4203 2012-06-24 03:00:00 14.9      ... 101.02          Clear
4204 2012-06-24 04:00:00 14.4      ... 101.04          Clear

[3 rows x 8 columns]

Обратите внимание, что я не указывал в явном виде, что данные сортируются по возрастанию; по умолчанию порядок установлен как возрастающий. Это упрощает написание кода для данного случая использования. Если же необходимо отсортировать данные по одному столбцу в порядке убывания, то достаточно явно указать порядок сортировки, что приводит нас к следующему случаю использования.

Случай использования №2: Сортировка по значениям одного столбца в порядке убывания

Для сортировки по убыванию нужно объявить False для параметра ascending в функции sort_values:

sort_by_weather_desc = weather.sort_values('Weather',ascending=False)
print(sort_by_weather_desc.head(n=3))

Тогда можно ожидать следующего результата:

     Date/Time           ... Weather
4757 2012-07-17 05:00:00 ... Thunderstorms,Rain,Fog
4761 2012-07-17 09:00:00 ... Thunderstorms,Rain Showers,Fog
4323 2012-06-29 03:00:00 ... Thunderstorms,Rain Showers,Fog

[3 rows x 8 columns]

Теперь вы узнали, как сортировать DataFrame по одному столбцу в порядке возрастания и убывания. Следующее, что необходимо изучить, - это сортировка DataFrame по нескольким столбцам.

Случай использования №3: Сортировка по нескольким значениям столбцов

Если вы помните, в двух предыдущих случаях использования я просто указывал один столбец в виде одной строки. Если же требуется сортировка по нескольким столбцам, то необходимо указать столбцы в виде списка строк:

sort_by_weather_temp = weather.sort_values(['Weather','Temp (C)'])
print(sort_by_weather_temp.head(n=3))

И вы получите такой результат:

    Date/Time              Temp (C) ... Stn Press (kPa) Weather
344 2012-01-15 08:00:00 -23.3    ... 102.45          Clear
363 2012-01-16 03:00:00 -19.2    ... 103.07          Clear
365 2012-01-16 05:00:00 -19.1    ... 103.02          Clear

[3 rows x 8 columns]

Сравните этот результат с результатом из примера №1. Очевидное различие заключается в том, что теперь самая низкая температура в таблице Clear weather находится в верхней части набора результатов. Одна из особенностей сортировки по нескольким столбцам заключается в том, что при сортировке существует приоритет. В данном случае я хочу отсортировать кадр данных сначала по погоде, а затем по температуре. Следовательно, список начинается с Weather, затем идет Temp. Это интуитивно понятный способ записи списка столбцов, по которым вы хотите отсортировать DataFrame.

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

Случай использования №4: Сортировка по нескольким значениям столбцов с различным порядком сортировки

Напомним, что ключевым моментом в предыдущем примере было использование списка для указания столбцов, по которым следует сортировать наш DataFrame. Аналогично, если мы хотим выбрать различный порядок сортировки для нескольких столбцов, мы также будем использовать список для указания различных порядков сортировки.

В данном случае я хочу отсортировать сначала по погоде в порядке возрастания, а затем по температуре в порядке убывания. Вот код, который я написал для этого:

sort_by_weather_asc_temp_desc = weather.sort_values(['Weather','Temp (C)'], ascending=[True, False])
print(sort_by_weather_asc_temp_desc.head(n=3))

Обратите внимание, что параметр ascending теперь принимает список булевых значений. Поскольку в первом параметре мы имеем список из двух имен столбцов, то и параметр ascending принимает список из двух булевых значений.

Вы, наверное, догадываетесь, но булевы значения в восходящем списке соответствуют столбцам в списке для значений столбцов. Теперь посмотрите на результат:

                Date/Time  Temp (C)  ...  Stn Press (kPa)  Weather
5199  2012-08-04 15:00:00      32.8  ...           101.39    Clear
5200  2012-08-04 16:00:00      32.5  ...           101.34    Clear
5201  2012-08-04 17:00:00      32.5  ...           101.32    Clear

[3 rows x 8 columns]

Как вы заметили, до сих пор sort_values имеет интуитивно понятный способ решения вопроса о сортировке столбцов. Используя эти четыре варианта, вы теперь можете удовлетворить большинство своих потребностей в сортировке.

Далее мы рассмотрим менее распространенные варианты использования. Например, как быть, если в столбцах есть значения "Неприменимо" (NA), и вы хотите, чтобы эти значения NA были на первом месте?

Пример №5: Сортировка, но сначала поместить отсутствующие значения

Полезно сравнить этот вариант использования с первым. Поэтому в данном случае я продолжаю сортировать в порядке возрастания по столбцу Weather, с дополнительным требованием помещать значения NA в начало:

sort_na_first = weather.sort_values('Weather',na_position='first')
print(sort_na_first.head(n=3))

В тестовых данных отсутствуют пропущенные значения для столбца Weather, поэтому разницы в наборе результатов по сравнению с первым вариантом использования нет. Однако вы можете поэкспериментировать с этим, загрузив тестовые данные и изменив их:

      Date/Time            Temp (C)  ...  Stn Press (kPa)  Weather
7103  2012-10-22 23:00:00       6.4  ...           101.34    Clear
4203  2012-06-24 03:00:00      14.9  ...           101.02    Clear
4204  2012-06-24 04:00:00      14.4  ...           101.04    Clear

[3 rows x 8 columns]

Вы, наверное, заметили, что во всех приведенных до сих пор примерах кода берется DataFrame и возвращается его отдельная копия. А что если необходимо отсортировать непосредственно DataFrame? Таким требованием будет сортировка DataFrame на месте.

Пример использования №6: Сортировать, но поставить на место

Опять же, я бы рекомендовал сравнить это с первым вариантом использования. И снова у Pandas есть полезный параметр, помогающий сортировать DataFrame на месте. И вы уже догадались, что он называется inplace:

weather.sort_values('Weather', inplace=True)
print(weather.head(n=3))

Заметили, что я больше не использую другую переменную для хранения результата выполнения sort_values? Это потому, что мы изменяем непосредственно DataFrame "Погода".

При выводе первых трех строк должен получиться тот же результат, что и в случае использования №1:

     Date/Time           Temp (C) ... Stn Press (kPa) Weather 
7103 2012-10-22 23:00:00      6.4 ...          101.34 Clear 
4203 2012-06-24 03:00:00     14.9 ...          101.02 Clear 
4204 2012-06-24 04:00:00     14.4 ...          101.04 Clear 

[3 rows x 8 columns]

Наконец, я хочу показать, как выполнить сортировку на месте при сортировке по индексу строки.

Use Case #7: Сортировка по индексу строки, но ставится на место

Если вы помните, что я упоминал, что sort_index просто использует индекс строки в качестве критерия сортировки, то этот случай использования будет легко понять:

weather.sort_index(inplace=True)
print(weather.head(n=3))

Если вы все делаете правильно, то должны увидеть, что первыми тремя строками будут строки с индексами 0, 1 и 2. Действительно, мы получаем следующее:

                 Date/Time  ...               Weather
0  2012-01-01 00:00:00  ...                   Fog
1  2012-01-01 01:00:00  ...                   Fog
2  2012-01-01 02:00:00  ...  Freezing Drizzle,Fog

[3 rows x 8 columns]

Заключение

В этой статье я объяснил две основные функции сортировки и рассказал о семи наиболее быстрых способах запуска сортировки на Pandas DataFrame. Благодаря концепциям, представленным в этих семи примерах использования, вы получили полное представление о функциях сортировки. Теперь вы можете смешивать и сочетать эти знания и решать любые задачи сортировки, которые у вас могут возникнуть. Удачи!

Вернуться на верх