Напишите пользовательскую функцию агрегирования в Pandas

Опубликовано: 27 Марта, 2022

Pandas в Python широко используется для анализа данных и состоит из некоторых прекрасных структур данных, таких как Dataframeand Series. В pandas есть несколько функций, которые могут оказаться большим подспорьем для программиста, одна из них - агрегатная функция. Эта функция возвращает одно значение из нескольких значений, взятых на вход, которые сгруппированы вместе по определенным критериям. Некоторые из агрегатных функций, среди прочего, являются средними, счетчиками, максимальными.

Syntax: DataFrame.agg(func=None, axis=0, *args, **kwargs)

Parameters:

  • axis: {0 or ‘index’, 1 or ‘columns’} = 0 or ‘index’ means the function is applied to each column and 1 or ‘columns’ means the function is applied to each row.
  • func: function, str, list or dict = It describes the function that is to be used for aggregation. Accepted combinations are: function, string function name (str), list of functions (list/dict).
  • *args: It specifies the positional arguments to pass to the function.
  • **kwargs: It specifies the keyword arguments to pass to the function.

Return: This function can return scalar, Series or Dataframe. The return is scalar when Series.agg is called with a single function, it is Series when Dataframe.agg is called with a single function, it will be Dataframe when Dataframe.agg is called with several functions.

Создадим Dataframe:

Python3

# import pandas library
import pandas as pd
  
# create a Dataframe
df = pd.DataFrame([[10, 20, 30],
                  [40, 50, 60],
                  [70, 80, 90],
                  [100,110,120]],
                 columns=["Col_A", "Col_B",
                          "Col_C"])
# show the dataframe
df

Выход:

Теперь выполним несколько операций:

1. Выполнение агрегирования по строкам: выполняет агрегатные функции по строкам фрейма данных. Как вы можете видеть в приведенных ниже примерах, в примере 1 внутри агрегатной функции есть два ключевых слова: sum и min. Сумма складывает первый (10,40,70,100), второй (20,50,80,110) и третий (30,60,90,120) элементы каждой строки отдельно и распечатывает его, min находит минимальное число среди элементов строк и распечатайте его. Аналогичный процесс со вторым примером.

Example 1:

Python3

df.agg(["sum", "min"])

Выход:

Example 2:

Python3

df.agg(["sum", "min", "max"])

Выход:

2. Выполнение агрегирования по столбцам: выполняет агрегатную функцию по столбцам, столбцы выбираются, в частности, как показано в примерах. В первом примере выбраны два столбца: «Col_A» и «Col_B», и над ними должны быть выполнены операции. Для Col_A вычисляются минимальное значение и суммарное значение, а для Col_B вычисляются минимальное и максимальное значение. Аналогичный процесс с примером 2.

Example 1:

Python3

df.agg({"Col_A" : ["sum", "min"], 
        "Col_B" : ["min", "max"]})

Выход:

Example 2:

Python3

df.agg({"Col_A" : ["sum", "min"],
        "Col_B" : ["min", "max"],
        "Col_C" : ["sum", "mean"]})

Выход:

Примечание: он напечатает NaN, если конкретная агрегация не выполняется для определенного столбца.

3. Выполнение агрегирования по столбцам: выполняет агрегатную функцию по столбцам. Как показано в примере 1, среднее значение первого (10,20,30), второго (40,50,60), третьего (70,80,90) и четвертого (100,110,120) элементов каждого столбца вычисляется отдельно и печатается.

Example:

Python3

df.agg("mean", axis = "columns")

Выход:

4 . Пользовательская агрегатная функция: иногда возникает необходимость создать нашу собственную агрегатную функцию.

Example: Consider a data frame consisting of student id (stu_id), subject code (sub_code) and marks (marks). 

Python3

# import pandas library
import pandas as pd
   
# Creating DataFrame
df = pd.DataFrame(
    {"stud_id" : [101, 102, 103, 104
                  101, 102, 103, 104],
     "sub_code" : ["CSE6001", "CSE6001", "CSE6001"
                   "CSE6001", "CSE6002", "CSE6002",
                   "CSE6002", "CSE6002"],
     "marks" : [77, 86, 55, 90
                65, 90, 80, 67]}
)
  
# Printing DataFrame
df

Выход:

Now if you need to calculate the total marks (marks of two subjects) of each student (unique stu_id). This process can be done using custom aggregate function. Here my custom aggregate function is ‘total’.

Python3

# Importing reduce for 
# rolling computations
from functools import reduce
  
# define a Custom aggregation 
# function for finding total
def total(series):
      return reduce(lambda x, y: x + y, series)
  
# Grouping the output according to 
# student id and printing the corresponding 
# total marks and to check whether the
# output is correct or not, sum function 
# is also used to print the sum.
df.groupby("stud_id").agg({"marks": ["sum", total]})

Выход:

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

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.