Рубрики
Без рубрики

Как отсортировать фрейм данных Панд по дате

В этом уроке мы рассмотрим, как сортировать фрейм данных Pandas по одному и нескольким столбцам дат в порядке возрастания и убывания в Python с примерами.

Автор оригинала: 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 . Без правильного определения типа данных мы рискуем, что Панды вообще не узнают наши даты.