Автор оригинала: Rikesh Nichani.
Как отсортировать фрейм данных Панд по дате
Вступление
Pandas-чрезвычайно популярная библиотека для обработки и анализа данных. Это инструмент для загрузки и анализа наборов данных для многих.
Правильная сортировка данных является важнейшим элементом многих задач, связанных с анализом данных. В этом уроке мы рассмотрим как отсортировать фрейм данных Pandas по дате .
Давайте начнем с создания простого DataFrame
с несколькими датами:
import pandas as pd data = {'Name':["John", "Paul", "Dhilan", "Bob", "Henry"], 'Date of Birth': ["01/06/86", "05/10/77", "11/12/88", "25/12/82", "01/06/86"]} df = pd.DataFrame(data) print(df)
По умолчанию наши выходные данные сортируются по индексу DataFrame
s:
Name Date of Birth 0 John 01/06/86 1 Paul 05/10/77 2 Dhilan 11/12/88 3 Bob 25/12/82 4 Henry 01/06/86
Орлиный глаз может заметить, что у Иоанна и Павла одна и та же дата рождения-это нарочно, как мы сейчас увидим.
Преобразование строк в Datetime в Pandas DataFrame
У нас есть ввод Дата рождения
в формате даты, и он, по-видимому, отформатирован как таковой. Однако первое, что нам нужно сделать, это убедиться, что Панды распознают и понимают, что эта дата на самом деле является датой.
Способ, которым Панды хранят и манипулируют данными в Фрейме данных
, определяется его типом данных.
Тип данных каждого значения присваивается автоматически, исходя из того, как оно выглядит. 60
будет присвоен целочисленный тип, в то время как John
будет присвоен строковый тип. Давайте проверим текущий тип данных каждого столбца:
print(df.dtypes)
Это дает нам наш список типов данных:
Name object Date of Birth object dtype: object
Мы видим, что нашему столбцу Дата рождения
по умолчанию присвоен базовый строковый тип объекта. Однако для того, чтобы правильно сортировать, анализировать или манипулировать нашими датами, нам нужно, чтобы Панды распознали, что этот столбец содержит даты.
Давайте явно изменим тип данных в нашем столбце Date of Birth
с object
type на datetime
type.
Самый простой способ сделать это-использовать функцию to_datetime()
:
df["Date of Birth"] = pd.to_datetime(df["Date of Birth"]) print(df.dtypes)
Теперь, если мы проверим наш вывод:
Name object Date of Birth datetime64[ns] dtype: object
Итак, мы видим, что успешно изменили наш тип данных на datetime
.
Кроме того, мы можем вручную указать тип данных нашего столбца, если, конечно, мы знаем, какой тип данных мы хотим, чтобы он был:
df["Date of Birth"] = df["Date of Birth"].astype('datetime64[ns]')
Выход:
Name object Date of Birth datetime64[ns] dtype: object
Хотя оба этих метода дают один и тот же результат, метод to_date time()
является предпочтительным, поскольку он был явно разработан для этой цели.
Сортировка фрейма данных по дате в Pandas
Теперь, когда Панды правильно распознают наши типы данных, давайте отсортируем DataFrame
.
Примечание: Все методы , которые мы будем использовать, не сортируют на месте , поэтому вам придется либо переназначить измененный DataFrame
на новую (или ту же) ссылочную переменную, чтобы сохранить изменение, либо вы можете использовать аргумент inplace
для изменения поведения по умолчанию.
Сортировка по одному столбцу даты в порядке возрастания
Метод sort_values()
по умолчанию сортирует данные в порядке возрастания. Для дат это будет означать, что первая или самая ранняя по порядку появится в верхней части списка:
df.sort_values(by='Date of Birth', inplace=True) print(df)
Запуск этого кода приводит к:
Name Date of Birth 1 Paul 1977-05-10 3 Bob 1982-12-25 0 John 1986-01-06 4 Henry 1986-01-06 2 Dhilan 1988-11-12
В качестве альтернативы, если вы не хотите использовать аргумент inplace
, вы можете просто переназначить возвращаемый Фрейм данных
из метода sort_values()
в df
(или любую другую ссылочную переменную:
df = df.sort_values(by='Date of Birth')
Поскольку у нас Джон и Генри имеют один и тот же день рождения, порядок основан на их соответствующем индексном номере.
Сортировка по одному столбцу даты в порядке убывания
Изменение порядка сортировки на нисходящий можно сделать, установив аргумент ascending
в значение False
при вызове функции sort_values()
:
df.sort_values(by='Date of Birth', ascending = False, inplace=True)
На этот раз мы сортируем наши данные в порядке убывания, то есть последние или самые последние появятся в верхней части нашего списка. Опять же поскольку у Джона и Генри один и тот же день рождения их порядок основан на их индексном номере:
Name Date of Birth 2 Dhilan 1988-11-12 0 John 1986-01-06 4 Henry 1986-01-06 3 Bob 1982-12-25 1 Paul 1977-05-10
Сортировка по нескольким столбцам Дат
Итак, что произойдет, если у нас есть несколько столбцов дат, по которым мы хотим отсортировать данные?
Давайте добавим еще один столбец, связанный с данными, в наш DataFrame
и убедимся, что оба наших типа данных назначены правильно:
# Values for the new column employment_start = ["22/05/16", "17/08/10", "22/05/16", "11/06/19", "16/06/05"] # Adding columns to DataFrame df['Employment Start'] = employment_start # Applying to_datetime() function to multiple columns at once df[['Date of Birth', 'Employment Start']] = df[['Date of Birth', 'Employment Start']].apply(pd.to_datetime) print(df.dtypes) print(df)
А теперь давайте проверим, хорошо ли все выглядит:
Name object Date of Birth datetime64[ns] Employment Start datetime64[ns] dtype: object Name Date of Birth Employment Start 0 John 1986-01-06 2016-05-22 1 Paul 1977-05-10 2010-08-17 2 Dhilan 1988-11-12 2016-05-22 3 Bob 1982-12-25 2019-11-06 4 Henry 1986-01-06 2005-06-16
Сортировка по нескольким столбцам дат в порядке возрастания
Чтобы отсортировать DataFrame
по Дате рождения
и Началу занятости
в порядке возрастания, нам просто нужно добавить оба имени столбцов в наш метод sort_values ()
. Просто имейте в виду, что приоритет сортировки определяется тем, какой столбец вводится первым:
df.sort_values(by=['Date of Birth', 'Employment Start'], inplace=True)
Поскольку этот метод по умолчанию имеет порядок возрастания, наш вывод будет следующим:
Name Date of Birth Employment Start 1 Paul 1977-05-10 2010-08-17 3 Bob 1982-12-25 2019-11-06 4 Henry 1986-01-06 2005-06-16 0 John 1986-01-06 2016-05-22 2 Dhilan 1988-11-12 2016-05-22
Поскольку Дата рождения
является первым столбцом, введенным в наш метод, Панды расставляют приоритеты. Поскольку у Джона и Генри одинаковая Дата рождения
, они сортируются по столбцу Начало занятости
.
Сортировка по нескольким столбцам дат в порядке убывания
Как и при сортировке по одному столбцу, мы можем изменить порядок сортировки на убывающий, изменив параметр ascending
на False
:
df.sort_values(by=['Date of Birth', 'Employment Start'], ascending = False, inplace=True)
Теперь наш вывод в порядке убывания выглядит следующим образом:
Name Date of Birth Employment Start 2 Dhilan 1988-11-12 2016-05-22 0 John 1986-01-06 2016-05-22 4 Henry 1986-01-06 2005-06-16 3 Bob 1982-12-25 2019-11-06 1 Paul 1977-05-10 2010-08-17
Как мы видим, Джон и Генри оба появляются выше в списке, поскольку дни рождения отображаются в порядке убывания. На этот раз, однако, Джон имеет приоритет над Генри из-за его более позднего Начала работы
даты.
Сортировка по нескольким столбцам дат и Сортировка по переменному порядку
Теперь, что, если мы не только хотим отсортировать с помощью нескольких столбцов, но и отсортировать эти столбцы с использованием различных критериев возрастания? С пандами это может быть реализовано в том же методе sort_values ()
, который мы использовали до сих пор. Нам просто нужно передать правильный и соответствующий список значений в параметре ascending
.
В этом примере предположим, что мы хотим отсортировать наше Начало работы
в порядке возрастания, то есть сначала самое длинное служение, но затем их Дату рождения
в порядке убывания, то есть самое молодое:
df.sort_values(by=['Employment Start', 'Date of Birth'], ascending = [True, False], inplace=True)
Данные сначала сортируются по Employment Start
в порядке возрастания, это имеет приоритет, так как это был первый столбец, переданный в нашем методе. Затем мы сортируем Дату рождения
в порядке убывания. Поскольку Дхилан и Джон имеют одну и ту же дату начала работы, Дхилан теперь имеет приоритет, поскольку он моложе Джона:
Name Date of Birth Employment Start 4 Henry 1986-01-06 2005-06-16 1 Paul 1977-05-10 2010-08-17 2 Dhilan 1988-11-12 2016-05-22 0 John 1986-01-06 2016-05-22 3 Bob 1982-12-25 2019-11-06
Вывод
Учитывая популярность библиотеки Pandas, неудивительно, что сортировка данных по столбцам является простым процессом. Мы рассмотрели гибкость использования метода sort_values()
в одном и нескольких столбцах, в восходящем, нисходящем и даже переменном порядке. Хотя мы сосредоточились на сортировке по дате, этот метод можно использовать для нескольких типов данных.
В частности, при сортировке по дате первым и, возможно, самым важным шагом является проверка правильности присвоения нашим данным типа datetime
. Без правильного определения типа данных мы рискуем, что Панды вообще не узнают наши даты.