Pandas GroupBy: группировка, суммирование и агрегация данных в Python
Last updated
Last updated
Метод groupby в Pandas — это невероятно мощный инструмент, который помогает получить эффективное и значимое понимание вашего набора данных. Всего в нескольких простых строках кода вы можете агрегировать данные в чрезвычайно понятные и мощные формы.
В конце этого руководства вы научитесь работать с методом .groupby()
из библиотеки Pandas, используя разбиение-применение-сочетание. Этот процесс эффективно обрабатывает большие наборы данных для манипуляции данными очень мощными способами. Вы научитесь полностью освоить метод, включая доступ к группам, преобразование данных и создание производных данных.
Оглавление
Метод Pandas .groupby()
работает аналогично оператору SQL GROUP BY
. На самом деле, он разработан чтобы быть похожим на свой аналог в SQL, используя его эффективность и интуитивность. Подобно оператору GROUP BY
в SQL, метод Pandas работает путем разделения данных, их агрегирования заданным образом (или способами) и повторной комбинации данных осмысленным образом.
Поскольку метод .groupby()
сначала разделяет данные, мы можем работать с группами напрямую. Так как агрегация выполняется после разделения, у нас есть полная свобода в том, как агрегировать данные. Pandas затем объединяет данные, чтобы представить их в виде осмысленного DataFrame.
Что замечательно в этом, так это то, что он позволяет нам использовать метод по-разному, особенно творчески. Благодаря этому метод является основой для понимания, как Pandas можно использовать для манипуляции и анализа данных. Длина этого руководства отражает его сложность и важность!
Pandas предоставляет множество вариантов для анализа и агрегации данных. Почему существует, казалось бы, так много пересекающихся методов? Ответ заключается в том, что каждый метод, такой как .pivot()
, .pivot_table()
, .groupby()
, предлагает уникальный подход к агрегации данных. Они не просто являются переименованными версиями, а представляют собой полезные способы для выполнения различных задач.
Чтобы следовать этому руководству, давайте загрузим пример DataFrame из библиотеки Pandas. Загрузим воображаемые данные о продажах, используя набор данных, размещенный на странице datagy на Github. Если вы хотите следовать инструкции шаг за шагом, скопируйте приведенный ниже код для загрузки набора данных с помощью метода .read_csv()
Вывод первых пяти строк с помощью метода .head()
дает некоторое представление о наших данных. Видно, что у нас есть столбец date
, содержащий дату транзакции. У нас есть строковые столбцы, охватывающие gender
и region
нашего продавца. Наконец, у нас есть целочисленный столбец sales
, представляющий общую стоимость продаж.
Давайте впервые взглянем на метод Pandas .groupby()
. Мы можем создать объект GroupBy
, применив метод к нашему DataFrame и передав либо столбец, либо список столбцов. Посмотрим, как это выглядит: создадим объект GroupBy и выведем его на экран.
Например, эти объекты имеют атрибут .ngroups
, который содержит количество групп, доступных в этом групп
Мы можем увидеть, что наш объект имеет 3 группы. Аналогично, мы можем использовать атрибут .groups
, чтобы получить представление о специфике получившихся групп. Вывод этого атрибута — это объект, похожий на словарь, который содержит наши группы в качестве ключей. Значения этих ключей — это индексы строк, принадлежащих этой группе!
Если мы хотим увидеть только названия групп нашего объекта GroupBy, мы можем просто вернуть только ключи этого словаря.
Мы можем видеть, насколько полезен этот метод! Он позволяет нам группировать данные значимым образом.
Мы также можем выбрать все записи, принадлежащие определенной группе. Это может быть полезно, если вы хотите увидеть данные каждой группы. Чтобы сделать это, мы можем применить метод .get_group()
и передать имя группы, которую мы хотим выбрать. Давайте попробуем выбрать регион 'South'
из нашего объекта GroupBy:
Это может быть весьма полезно, если вы хотите получить некоторое представление о данных. Аналогично, это дает вам понимание того, как метод .groupby()
на самом деле используется для агрегирования данных. В следующем разделе вы узнаете, как работает метод Pandas groupby, используя методологию разделения, применения и объединения.
Метод groupby в Pandas использует процесс, известный как "разделяй, применяй и объединяй", для полезной агрегации или модификации DataFrame. Этот процесс работает точно так, как и назван.
Разделение данных на группы в зависимости от определенных критериев
Применение функции к каждой группе независимо
Объединение результатов в подходящую структуру данных
В предыдущем разделе, когда вы применили метод .groupby()
и передали в него столбец, вы уже выполнили первый шаг! Вы смогли разделить данные на соответствующие группы, основываясь на переданных вами критериях.
Причина применения этого метода заключается в том, чтобы разбить проблему анализа больших данных на управляемые части. Это позволяет выполнять операции над отдельными частями и затем объединять их. Хотя шаги применения и объединения выполняются по отдельности, Pandas абстрагирует их, создавая впечатление единого шага.
Прежде чем углубляться в то, как работает метод .groupby()
, давайте посмотрим, как мы можем воспроизвести его без использования этой функции. Преимущество этого подхода заключается в том, что мы можем легко понять каждый шаг процесса.
Разделение данных: Начнем с разделения данных – мы можем пройтись по каждому уникальному значению в DataFrame, разделяя данные по столбцу 'region'.
Применение функции агрегации: Оттуда мы можем выбрать строки из DataFrame, соответствующие условию, и применить к ним функцию.
Это много кода, чтобы написать для простой агрегации! К счастью, метод groupby в Pandas делает это намного проще. В следующем разделе вы узнаете, как значительно упростить этот процесс.
В этом разделе вы узнаете, как использовать метод groupby из Pandas для агрегации данных различными способами. Мы попробуем воссоздать тот же результат, о котором вы узнали ранее, чтобы увидеть, насколько проще на самом деле этот процесс! Давайте посмотрим, как выглядит код, а затем разберем, как он работает:
Посмотрите на код! Мы смогли сократить шесть строк кода до одной! Давайте разберем это по элементам:
df.groupby('region')
вам уже знакомо. Оно разделяет данные на различные группы на основе столбца region
.
['sales']
выбирает только этот столбец из групп
.mean()
применяет метод вычисления среднего для каждого столбца в группе.
Данные объединены в результирующий DataFrame, averages
Давайте более наглядно рассмотрим весь процесс. Чтобы упростить понимание, давайте посмотрим только на первые семь записей DataFrame:
На изображении выше вы можете увидеть, как данные сначала разделяются на группы, выбирается столбец, затем применяется агрегирование, и полученные данные объединяются.
Теперь, когда вы понимаете, как работает процедура разделения, применения и объединения, давайте рассмотрим некоторые другие способы агрегации в Pandas. Таблица ниже предоставляет обзор доступных функций агрегации:
.count()
Количество ненулевых записей
.sum()
Сумма значения
.mean()
Среднее арифметическое значений
.median()
Медиана значений
.min()
Минимальное значение группы
.max()
Максимальное значение группы
.mode()
Наиболее часто встречающееся значение в группе
.std()
Стандартное отклонение группы
.var()
Дисперсия группы
Pandas также предоставляет дополнительный метод .agg()
, который позволяет применять несколько агрегирующих функций в методе .groupby()
. Этот метод позволяет передавать список вызовов (т. е. функции без скобок). Давайте посмотрим, как мы можем использовать некоторые функции из библиотеки numpy
для агрегации.
Метод .agg()
позволяет легко генерировать сводные статистические данные по различным группам. Без этого нам пришлось бы применять метод .groupby()
три раза, но здесь мы смогли сократить это до одного вызова метода!
Еще один невероятно полезный способ использовать метод groupby в Pandas — это трансформация данных. Что это значит? Трансформируя данные, вы выполняете операцию, специфичную для этой группы. Это может включать, например, стандартизацию данных только на основе этой группы с использованием z-оценки или заполнение отсутствующих данных, вводя значение на основе этой группы.
Операция трансформации отличается от агрегации и фильтрации с использованием .groupby()
, тем что результирующий DataFrame имеет такие же размеры, как и исходные данные. Хотя это может быть верно для агрегации и фильтрации, для трансформации это всегда верно.
Метод .transform()
вернет одно значение для каждой записи в оригинальном наборе данных. Поэтому, гарантируется, что размер результата будет совпадать.
Давайте рассмотрим пример преобразования данных в Pandas DataFrame. В этом примере мы рассчитаем, какой процент от общих продаж региона составляет каждая продажа. Для этого мы можем применить метод .transform()
к объекту GroupBy. Мы можем передать функцию 'sum'
, чтобы вернуть сумму для всей группы в каждой строке. Наконец, мы делим исходный столбец 'sales'
на эту сумму.
Давайте посмотрим, как выглядит этот код:
В полученной таблице видно, какую часть от общего объема продаж в регионе составила каждая продажа.
В предыдущем разделе вы преобразовали данные с помощью функции .transform()
, но мы также можем применить функцию, которая вернет одно значение без агрегации. Например, давайте применим метод .rank()
к нашей группировке. Это позволит нам ранжировать значения в каждой группе. Вместо использования метода .transform()
, мы непосредственно применим метод .rank()
В этом случае метод .groupby()
возвращает серию Pandas такой же длины, как и исходный DataFrame. Поэтому мы можем просто присвоить эту серию новому столбцу.
Замечательный способ использования метода .groupby()
— фильтрация DataFrame. Этот подход значительно отличается от обычной фильтрации, так как позволяет применять метод фильтрации на основе некоторых агрегаций значений группы. Например, мы можем отфильтровать наш DataFrame, чтобы удалить строки, где средняя цена продажи группы меньше 20,000.
Let’s break down how this works:
We group our data by the 'region'
column
We apply the .filter()
method to filter based on a lambda function that we pass in
The lambda function evaluates whether the average value found in the group for the 'sales'
column is less than 20,000
Этот подход избавляет нас от необходимости сначала определять среднее значение для каждой группы, а затем отфильтровывать эти значения. В данном примере подход может показаться немного излишним. Однако он открывает огромный потенциал при работе с более мелкими группами.
Мы можем расширить функциональность метода Pandas .groupby()
, группируя данные по нескольким столбцам. Ранее вы группировали DataFrame только по одному столбцу, передавая строку, представляющую столбец. Однако можно также передать список строк, представляющих различные столбцы. Это позволяет разделить данные еще более детально.
Давайте вычислим сумму всех продаж, разделенных по 'region'
и по 'gender'
, написав.
Более того, все методы, которые мы рассмотрели ранее, также возможны и в этом случае. Например, мы могли бы применить функцию .rank()
снова и определить топ-продажи в каждой комбинации регион
Еще одна отличная функция метода .groupby()
в Pandas заключается в том, что мы можем применять наши собственные функции. Это позволяет определять функции, которые соответствуют потребностям нашего анализа. Вы уже видели это в примере фильтрации с использованием метода .groupby()
. Мы можем использовать либо анонимную лямбда-функцию, либо сначала определить функцию и применить ее.
Давайте посмотрим, как это может работать. Мы можем определить пользовательскую функцию, которая будет возвращать диапазон группы, вычисляя разницу между минимальным и максимальным значениями. Давайте определим эту функцию и применим её к нашему вызову метода .groupby()
.
Функция group_range()
принимает один параметр, который в данном случае представляет собой серии наших группировок 'sales'
. Мы находим наибольшее и наименьшее значения и возвращаем разницу между ними. Это может быть полезно для оценки различий в диапазонах разных групп.
В этом разделе вы узнаете о полезных вариантах использования метода Pandas .groupby()
. Примеры в этом разделе призваны продемонстрировать более креативные способы использования метода. Эти примеры предназначены для вдохновения и расширения вашего понимания различных способов использования метода.
Давайте посмотрим, как вы можете вернуть пять строк из каждой группы в результирующий DataFrame. Это может быть особенно полезно, когда вы хотите получить представление о том, как могут выглядеть данные в каждой группе. Если порядок сортировки данных в DataFrame не имеет значения, вы можете просто использовать функцию .head()
, чтобы вернуть любое количество записей из каждой группы.
Давайте рассмотрим, как вернуть две записи из каждой группы, где каждая группа определяется регионом и полом:
В этом примере вы узнаете, как выбрать n-е по величине значение в заданной группе. Для этого мы можем использовать метод .nlargest()
, который вернет n-е по величине значение. Например, если мы хотим вернуть второе по величине значение в каждой группе, мы можем просто передать значение 2. Давайте посмотрим, как это выглядит:
Пора проверить свои знания! Используйте упражнения ниже, чтобы попрактиковаться в использовании метода .groupby()
. Решения можно найти, нажав на раздел под каждым вопросом.
В этом уроке вы узнали о методе .groupby()
в Pandas. Этот метод позволяет анализировать, агрегировать, фильтровать и преобразовывать ваши данные множеством полезных способов. Ниже вы найдёте краткое резюме метода .groupby()
в Pandas:
Метод .groupby()
в Pandas позволяет выполнять агрегирование, преобразование и фильтрацию DataFrame
Метод работает с использованием операций разделения, преобразования и применения
Вы можете сгруппировать данные по нескольким столбцам, передав список столбцов
Вы можете легко применять несколько агрегатов, используя метод .agg()
Вы можете использовать метод для преобразования ваших данных полезными способами, такими как вычисление z-оценок или ранжирование данных по различным группам.
To learn more about related topics, check out the tutorials below:
Pandas: подсчет уникальных значений в объекте GroupBy
Python Defaultdict: обзор и примеры
Вычислить средневзвешенное значение в Pandas и Python
Мы видим, что это вернуло . Поскольку это объект, мы можем изучить некоторые его атрибуты.
.groupby()
Например, если мы захотим для каждой группы, мы могли бы просто написать:
Официальную документацию для метода Pandas .groupby()
можно