Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Васильев Ю. - Python для data science (Библиотека программиста) - 2023.pdf
Скачиваний:
7
Добавлен:
07.04.2024
Размер:
7.21 Mб
Скачать

138      Глава 6. Агрегирование данных

4

2022-02-04 East

15.0

5

2022-02-04 East

82.0

6

2022-02-05 East

44.0

7

2022-02-05 East

38.0

8

2022-02-05 West

35.0

9

2022-02-06 West

60.0

10

2022-02-06

West

26.0

11

2022-02-05

East

78.0

12

2022-02-06

East

54.0

13

2022-02-06

East

56.0

 

 

 

 

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

Группировка и агрегирование данных

Чтобы выполнить агрегированные расчеты на основе данных, нужно сначала распределить данные по соответствующим группам. Встроенная в pandas функция groupby() разбивает данные датафрейма на подмножества, которые имеют совпадающие значения в одном или нескольких столбцах. В нашем случае для группировки датафрейма df_result по дате и региону можно использовать groupby(). Затем мы применяем агрегатную функцию pandas sum() к каждой группе. Обе операции можно выполнить в одной строке кода:

df_date_region = df_result.groupby(['Date','Region']).sum()

Первая группа формируется на основе столбца Date. А затем для каждой даты создаем группы по столбцу Region. Функция groupby()возвращает объект, к которому затем применяется агрегатная функция sum(). Эта функция суммирует значения числовых столбцов. В данном примере sum() применяется только к столбцу Total, поскольку это единственный числовой столбец в датафрейме. (Если бы в датафрейме были другие числовые столбцы, функция агрегирования была бы применена и к ним.) В итоге датафрейм df_resultбудет выглядеть так:

 

 

Total

Date

Region

 

2022-02-04

East

97.0

 

West

243.0

2022-02-05

East

160.0

 

West

35.0

2022-02-06

East

110.0

 

West

86.0

 

 

 

Группировка и агрегирование данных      139

Оба столбца, Date и Region, являются индексными столбцами нового дата­ фрейма. Вместе они образуют иерархический индекс, также известный как

многоуровневый индекс, или просто MultiIndex.

MultiIndex позволяет работать с данными, имеющими произвольное количество измерений, в рамках двумерной структуры датафрейма, используя несколько столбцов для уникальной идентификации каждой строки. В нашем случае датафрейм df_date_regionможно рассматривать как трехмерный датасет с тремя осями: дата, регион и агрегированное значение (каждая ось представляет соответствующее измерение), как показано в табл. 6.1.

Таблица 6.1. Три измерения датафрейма df_date_region

Ось

Координаты

 

 

Date

2022-02-04, 2022-02-05, 2022-02-06

 

 

Region

West, East

 

 

Aggregation

Total

 

 

ПРИМЕЧАНИЕ

В данном контексте координаты — возможные значения для данной оси.

MultiIndex нашего датафрейма позволяет писать запросы для перемещения по измерениям датафрейма и получения доступа к итоговым данным (total) по дате, региону или сразу обоим. Мы сможем однозначно идентифицировать каждую строку датафрейма и получить доступ к выбранным агрегированным значениям в различных группах данных.

Просмотр конкретных агрегированных показателей по MultiIndex

Просмотр определенных категорий информации внутри датафрейма — распространенный запрос. Например, из только что созданного датафрейма df_ date_regionможет понадобиться получить агрегированные данные о продажах только на определенную дату или в конкретном регионе и на определенную дату одновременно. Для поиска требуемого агрегированного показателя можно использовать индекс датафрейма (или MultiIndex).

Чтобы понять, как работать с MultiIndex, полезно посмотреть, в каком виде каждое его значение представлено в Python. Для этого можно воспользоваться свойством index датафрейма df_date_region:

print(df_date_region.index)

140      Глава 6. Агрегирование данных

Свойство indexвозвращает все значения индексов или метки строк датафрейма независимо от того, имеет этот датафрейм простой индекс или MultiIndex. Вот значения MultiIndex датафрейма df_date_region:

MultiIndex([('2022-02-04', 'East'), ('2022-02-04', 'West'), ('2022-02-05', 'East'), ('2022-02-05', 'West'), ('2022-02-06', 'East'), ('2022-02-06', 'West')], names=['Date', 'Region'])

Как видите, каждое значение MultiIndex представляет собой кортеж, который можно использовать для доступа к соответствующему значению в поле Total. Исходя из этого, получить доступ к общим показателям на определенную дату и регион можно следующим образом:

df_date_region [df_date_region.index.isin( [('2022-02-05', 'West')])]

Мы помещаем кортеж, представляющий собой нужный MultiIndex, в оператор [] и передаем его методу pandas index.isin(). Метод требует, чтобы передаваемый параметр был итерируемым (список, кортеж, серия, датафрейм или словарь), поэтому заключаем MultiIndex в квадратные скобки. Метод возвращает булев массив, указывающий, соответствуют ли данные в каждом из значений индекса датафрейма заданному значению(ям): при соответствии возвращается True, в противном случае — False. В данном примере метод isin() генерирует массив [False, False, False, True, False, False], следовательно, совпадает четвертое значение индекса.

Затем мы передаем массив с булевыми значениями в датафрейм df_date_region внутри оператора [] , и в результате выбирается соответствующий показатель продаж, как показано ниже:

Date

Region

Total

 

2022-02-05 West

35.0

 

 

 

Ограничений по количеству извлекаемых из датафрейма строк нет. В index. isin() можно передавать несколько индексов и получать соответствующие значения:

df_date_region[df_date_region.index.isin([('2022-02-05', 'East'), ('2022-02-05', 'West')])]

Группировка и агрегирование данных      141

Код выше вернет следующие строки из df_date_region:

Total

Date Region

2022-02-05 East

160.0

West

35.0

 

 

Хотя в данном примере используются два соседних индекса, в index.isin() можно передавать любые индексы в произвольном порядке, например так:

df_date_region[df_date_region.index.isin([('2022-02-06', 'East'), ('2022-02-04', 'East'), ('2022-02-05', 'West')])]

Набор извлеченных строк будет выглядеть следующим образом:

 

 

Total

Date

Region

 

2022-02-04

East

97.0

2022-02-05

West

35.0

2022-02-06

East

110.0

 

 

 

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

Срез диапазона агрегированных значений

Подобно тому как срез используется для получения диапазона значений из списка, его можно применять для извлечения диапазона агрегированных значений из датафрейма. Создать срез из датафрейма df_date_regionможно, предоставив два кортежа, указывающих ключи MultiIndex начальной и конечной позиций диапазона среза. В следующем примере получим диапазон агрегированных значений по всем регионам с 2022-02-04 по 2022-02-05. Просто поместим начальное и конечное значения MultiIndex в квадратные скобки и разделим их двоеточием:

df_date_region[('2022-02-04', 'East'):('2022-02-05', 'West')]

В результате получим следующие строки:

Total

Date Region

2022-02-04 East

97.0