Groupby настолько мощный, что может показаться пугающим для новичков, но вам не нужно знать все его функции.

Нет необходимости оправдывать важность библиотеки pandas в мире науки о данных. Если вы используете Python, эта библиотека - незаменимый инструмент для любых задач по обработке данных. Одна универсальная функциональность библиотеки pandas построена на функции groupby, которая создает объект GroupBy, поддерживающий множество возможных операций.

Однако функциональность, связанная с groupby, настолько мощна, что многим из нас так трудно запомнить все ее функции. Более того, еще одним заметным побочным эффектом универсальности является то, что новички могут потеряться в том, как использовать функцию groupby. В этой статье я хотел бы рассмотреть 8 наиболее распространенных операций, которые мы можем выполнять с объектом GroupBy.

1. Создайте таблицу частот.

Давайте сначала извлечем набор данных (знаменитый набор данных радужной оболочки глаза), который мы хотим использовать, как показано ниже.

Когда у нас есть записи данных с категориальными переменными, обычно нам нужно знать количество записей по группам. В этом случае мы можем создать таблицу частот, используя функцию size() GroupBy. Как видите, у нас есть 50 записей для каждого из трех видов.

Следует отметить, что мы создаем объект GroupBy (т.е. iris_gb), потому что в дальнейшем мы будем использовать его несколько раз.

2. Вычислить общую описательную статистику (например, среднее, минимальное, максимальное)

Чтобы вычислить средние по группам, мы просто воспользуемся функцией mean().

По умолчанию функция mean() выполняет вычисление для всех числовых столбцов. Если вам нужны средства для определенных столбцов, мы можем указать это, как показано ниже.

Подобным образом мы можем вычислить минимум и максимум для каждой группы в объекте GroupBy, используя функции min() и max(), как и функцию mean(). Мы также можем рассчитать медианное значение и стандартное отклонение.

# Calculate the min
iris_gb.min()
# Calculate the max
iris_gb.max()
# Calculate the median
iris_gb.median()
# Calculate the SD
iris_gb.std()

3. Найдите индекс максимума (или минимума)

Если вы хотите узнать индекс максимальной записи для каждой группы, вместо того, чтобы найти максимальную запись и найти ее индекс, есть удобная функция, которая выполняет эту работу напрямую. См. ниже.

Эта функция может быть полезной. Например, предположим, что мы хотим получить записи для записей с наибольшей длиной чашелистника, мы можем сделать следующее:

4. Сбросить индекс после Groupby

Иногда после groupby обработки нам нужны дополнительные операции. В частности, мы хотим сбросить индекс группировки, чтобы сделать их регулярными строками и столбцами. Первый вариант - использовать функцию reset_index() для созданного объекта DataFrame.

Второй вариант еще более удобен, поскольку он устанавливает аргумент as_index в функции groupby.

5. Простое агрегирование нескольких операций

Технически мы можем выполнять несколько операций индивидуально, как показано выше. Однако эти операции можно выполнять, используя функцию agg() объекта GroupBy. Рассмотрим следующий тривиальный пример.

  • Для наглядности мы рассчитываем результаты только для двух столбцов: sepal_length и petal_length.
  • В функции agg мы указываем имена функций, которые хотим применить. В этом случае мы просим вычислить минимальное и среднее значения для обоих столбцов.

6. Агрегации по столбцам

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

В приведенном выше примере мы видим, что агрегирование вычисляет минимальное и максимальное значение для sepal_length, а также среднее и стандартное значение для petal_length. Синтаксис в основном передает словарь, в котором столбцы являются ключами, а функции вычислений - значениями.

7. Именованные агрегаты

Вы, возможно, заметили, что выходной файл не слишком удобен для пользователя из-за использования многоуровневого индекса. Соответственно, у вычисляемых полей не очень простые имена. Чтобы решить эту проблему, мы можем рассмотреть возможность именованной агрегации, как показано ниже.

В приведенном выше коде используется NamedAgg, реализованный в pandas. Как видите, четыре вычисляемых столбца имеют правильные имена. Примечательно, что NamedAgg - это своего рода именованные кортежи, и поэтому мы можем напрямую передавать кортежи в качестве ярлыка. Эквивалентный код ниже.

iris_gb.agg(
    sepal_min=("sepal_length", "min"),
    sepal_max=("sepal_length", "max"),
    petal_mean=("petal_length", "mean"),
    petal_std=("petal_length", "std")
)

8. Используйте пользовательские функции.

Пока что функции, которые мы применяем в вычислениях, передаются по именам (например, «min», «mean»). Однако возможно, что мы можем напрямую передать объект функции. Обратите внимание на следующее.

Примечательно, что объекты функций можно использовать вместе с именами функций. Следующий код также является допустимым вызовом.

iris_gb.agg(["min", pd.Series.mean])

Кроме того, вы можете указать собственные функции. В следующем фрагменте кода показан тривиальный пример.

Поскольку лямбда-функции также являются функциями по своей сути, мы можем использовать лямбда-функцию с объектом GroupBy, как показано ниже. Код эквивалентен приведенному выше фрагменту.

# Use a lambda function
iris_gb.agg(lambda x: x.mean())

Выводы

В этой статье мы рассмотрели восемь наиболее распространенных операций, которые мы можем выполнять с объектом GroupBy, используя функцию groupby в пандах. Конечно, это не исчерпывающий список функций, доступных с помощью объекта GroupBy. Вместо этого они представляют собой лишь некоторые важные элементы, которые имеют отношение к большинству повседневных потребностей в обработке данных.