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

Введение Pandas - чрезвычайно популярная библиотека для обработки и анализа данных. Для многих это незаменимый инструмент для загрузки и анализа наборов данных. Правильная сортировка данных - важный элемент многих задач, связанных с анализом данных. В этом руководстве мы рассмотрим, как отсортировать фрейм данных Pandas по дате. Давайте начнем с создания простого DataFrame с несколькими датами: импортируйте панды как pd data = {'Name': ["John", "Paul", "Dhilan", "Bob", "Henry"], 'Date of Birth ': ["01/06/86", "05/10

Вступление

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

Мы вводим Date of Birth в формате даты, и, похоже, она отформатирована как таковая. Однако первое, что нам нужно сделать, это убедиться, что Pandas распознает и понимает, что эта дата на самом деле является датой.

То, как Pandas хранит и обрабатывает данные в DataFrame , определяется его типом данных.

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

 print(df.dtypes) 

Это дает нам список типов данных:

 Name object 
 Date of Birth object 
 dtype: object 

Мы видим, что нашему Date of Birth » по умолчанию назначен базовый строковый тип объекта. Однако, чтобы правильно сортировать, анализировать или правильно манипулировать нашими датами, нам нужно, чтобы Pandas распознал, что этот столбец содержит даты.

Давайте явно изменим тип данных в нашем столбце « Date of Birth с типа object datetime .

Самый простой способ сделать это - использовать 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_datetime() является предпочтительным, поскольку он был специально разработан для этой цели.

Сортировка DataFrame по дате в Pandas

Теперь, когда 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 , вы можете просто переназначить возвращаемый DataFrame из 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 оба Date of Birth и Employment Start в порядке возрастания, нам просто нужно добавить как имена столбцов нашего 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 

Поскольку Date of Birth - это первый столбец, введенный в нашем методе, Pandas отдает ему приоритет. Поскольку у Джона и Генри одинаковая Date of Birth , вместо этого они сортируются по Employment Start

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

Как и в случае сортировки по одному столбцу, мы можем изменить порядок по убыванию, изменив параметр 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 

Как мы видим, Джон и Генри оба отображаются выше в списке, поскольку дни рождения отображаются в порядке убывания. Однако на этот раз Джон имеет приоритет перед Генри из-за его более поздней Employment Start приема на работу.

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

А что, если мы хотим не только выполнить сортировку по нескольким столбцам, но и отсортировать эти столбцы с использованием разных критериев возрастания? В Pandas это можно реализовать с помощью того же sort_values() который мы использовали до сих пор. Нам просто нужно передать правильный и соответствующий список значений в ascending параметре.

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

 df.sort_values(by=['Employment Start', 'Date of Birth'], ascending = [True, False], inplace=True) 

Данные сначала сортируются по Employment Start в возрастающем порядке, это имеет приоритет, поскольку это был первый столбец, переданный в нашем методе. Затем мы сортируем Date of Birth в порядке убывания. Поскольку у Дилана и Джона одна и та же 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 Без правильного определения нашего типа данных мы рискуем, что Pandas вообще не распознает наши даты.
comments powered by Disqus