Рубрики
Без рубрики

Pandas Apply () – полезное иллюстрированное руководство

Функция Pandas Apply () используется для применения функций на объектах Pandas. У нас так много встроенных функций агрегации в пандах на объектах серии и DataFrame. Но, чтобы применить некоторые функции, специфичные для приложений, мы можем использовать функцию Apply (). Pandas Apply () – это как метод серии, так и метод DataFrame. https://youtu.be/-hgbuiwzhj8 Pandas … Pandas Apply () – Полезное иллюстрированное руководство Подробнее »

Автор оригинала: Priyatham.

Пандас Применить () Функция используется для применения функций на Пандас объекты. У нас так много встроенных функций агрегации в пандах на объектах серии и DataFrame. Но, чтобы применить некоторые функции, специфичные для приложений, мы можем использовать Применить () функция. Пандас Применить () является как серийный метод, так и метод DataFrame.

Давайте построим dataframe, в котором у нас есть информация о 4 человека.

>>> import pandas as pd
>>> df = pd.DataFrame(
...         {
...             'Name': ['Edward', 'Natalie', 'Chris M', 'Priyatham'],
...             'Sex' : ['M', 'F', 'M', 'M'],
...             'Age': [45, 35, 29, 26],
...             'weight(kgs)': [68.4, 58.2, 64.3, 53.1]
...         }
...     )

>>> print(df)
        Name Sex  Age  weight(kgs)
0     Edward   M   45         68.4
1    Natalie   F   35         58.2
2    Chris M   M   29         64.3
3  Priyatham   M   26         53.1

pandas.series.apply принимает любой из двух различных видов функций в качестве аргумента. Они есть:

  • Функции Python
  • Универсальные функции Numpy (Ufuncs)

1. Функции Python

В Python есть 3 различных вида функций в целом;

  • Встроенные функции
  • Определенные пользователем функции
  • Лямбда функции

a) Применение встроенных функций Python на серии

Если мы хотели бы узнать длину имена каждого человека, мы можем сделать это, используя Лен () Функция в Python.

Например, если мы хотим знать длину строки «Python», мы можем получить следующий код;

>>> len("Python")
6

Один столбец в DataFrame – это объект серии. Теперь мы хотели бы применить то же самое Лен () Функция на всей «имени» столбец The DataFrame. Это может быть достигнуто с использованием Применить () функция в следующем коде;

>>> df['Name'].apply(len)
0    6
1    7
2    7
3    9
Name: Name, dtype: int64

Если вы соблюдаете вышеуказанный кодовый фрагмент, Лен внутри Применить () Функция не имеет никакого аргумента. В общем, любая функция принимает некоторые данные для работы на них. В Лен ("Python") Кодовый фрагмент, он принимает "Python" строка в качестве входных данных для вычисления его длины. Здесь входные данные напрямую взяты из объекта серии, который называл функцию, используя Применить () Отказ

При нанесении функций Python каждое значение в серии применяется один за другим и возвращает объект серии.

Вышеуказанный процесс может быть визуализирован как:

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

b) Применение пользовательских функций на серии

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

Код для этого есть,

>>> def add_age(age):
...     return age + 1

>>> df['Age'].apply(add_age)
0    46
1    36
2    30
3    27
Name: Age, dtype: int64

>>> df['Age'] = df['Age'].apply(add_age)

>>> df
        Name Sex  Age  weight(kgs)
0     Edward   M   46         68.4
1    Natalie   F   36         58.2
2    Chris M   M   30         64.3
3  Priyatham   M   27         53.1

Из вышеуказанного результата, основной момент, который следует отметить,

  • Индекс получателя Серия равно индексу объекта серии звонящих. Это делает процесс добавления результирующей серии в виде столбца в DataFrame проще.

Он работает так же, как применяя встроенные функции. Каждый элемент в серии пропускается по одному на функцию.

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

c) Применение функций лямбда на серии

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

Код для этого есть,

>>> df['Age'].apply(lambda x: x+1)
0    46
1    36
2    30
3    27
Name: Age, dtype: int64

>>> # Comparing the results of applying both the user-defined function and Lambda function
>>> df['Age'].apply(lambda x: x+1) == df['Age'].apply(add_age)
0    True
1    True
2    True
3    True
Name: Age, dtype: bool

Из приведенного выше результата вы можете наблюдать результаты применения пользовательской функции и функции лямбда одинаковы.

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

2. Универсальные функции Numpy (Ufuncs)

Numpy Имеет так много встроенных универсальных функций ( ufuncs ). Мы можем предоставить любой из Ufuncs в качестве аргумента для Применить () Метод на серии. Объект серии можно продумать как простое массив.

Разница между применением функций Python и Ufuncs;

  • При применении функций Python каждый элемент в серии работает один за другим.
  • При нанесении ufuncs вся серия работает одновременно.

Давайте выберем использовать UFUNC на полные значения с плавающей точкой весового столбца. У нас есть numpy.floor () UFUNC, чтобы достичь этого.

Код для этого есть,

>>> import numpy as np

>>> df['weight(kgs)']
0    68.4
1    58.2
2    64.3
3    53.1
Name: weight(kgs), dtype: float64 
>>> df['weight(kgs)'].apply(np.floor)
0    68.0
1    58.0
2    64.0
3    53.0
Name: weight(kgs), dtype: float64

В приведенном выше результате вы можете наблюдать за пол до ближайшего нижнего значения десятичного значения и поддерживать свой тип данных FLOAT64.

Мы можем визуализировать вышеуказанный процесс как:

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

  • Всякий раз, когда у нас есть ufunc. Для достижения нашей функциональности мы можем использовать его вместо определения функции Python.

Мы посмотрим на официальную документацию о Применить () Метод на DataFrame:

Pandas.dataframe.apply имеет два важных аргумента;

  • Func – Функция для применения вдоль упомянутой оси
  • Ось – ось вдоль которой функция применяется

Опять ось также имеет 2 возможных значения;

  1. Ось = 0 – Применить функцию для нескольких столбцов
  2. ось = 1 – Применить функцию на каждую строку

1. Pandas применяют функцию для нескольких столбцов

Допустим, люди в нашем наборе данных предоставили информацию о своем росте (в CMS). Это может быть добавлено с помощью следующего кода,

>>> df['height(cms)'] = [178, 160, 173, 168]
>>> df
        Name Sex  Age  weight(kgs)  height(cms)
0     Edward   M   45         68.4          178
1    Natalie   F   35         58.2          160
2    Chris M   M   29         64.3          173
3  Priyatham   M   26         53.1          168

Мы сделаем столбец «Имя» индекс DataFrame. Кроме того, мы получим подмножество данных DataFrame с «возрастом», «весом (кгс)» и столбцами «высоты (CMS)».

>>> data = df.set_index('Name')
>>> data
          Sex  Age  weight(kgs)  height(cms)
Name                                       
Edward      M   45         68.4          178
Natalie     F   35         58.2          160
Chris M     M   29         64.3          173
Priyatham   M   26         53.1          168

>>> data_subset = data[['Age', 'weight(kgs)', 'height(cms)']]
>>> data_subset
           Age  weight(kgs)  height(cms)
Name                                   
Edward      45         68.4          178
Natalie     35         58.2          160
Chris M     29         64.3          173
Priyatham   26         53.1          168

Если бы мы хотели получить средний возраст, вес и высоту всех людей, мы можем использовать Numpy ufunc numpy.mean () Отказ

Код для этого есть,

>>> import numpy as np
>>> data_subset.apply(np.mean, axis=0)
Age             33.75
weight(kgs)     61.00
height(cms)    169.75
dtype: float64

У нас напрямую функцию агрегации Pandas DataFrame под названием Среднее () который делает то же самое, что и выше;

>>> data_subset.mean()
Age             33.75
weight(kgs)     61.00
height(cms)    169.75
dtype: float64

Если вы соблюдаете результаты выше, результаты функции агрегации Pandas DataFrame и применения ufunc равны. Итак, мы не используем Применить () Метод в таких простых сценариях, где мы имеем функции агрегации.

  • Всякий раз, когда вы должны применить некоторые сложные функции на DataFrames, затем используйте подать заявление( ) метод.

2. Pandas применить функцию на каждую строку

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

Это может быть представлено с использованием словаря;

>>> male_fitness = {
...     #height  : (weight_lower_cap, weight_upper_cap)
...     178      : (     67.5       ,      83         ),
...     173      : (     63         ,      70.6       ),
...     168      : (     58         ,      70.7       )
... }
>>> female_fitness = {
...     #height  : (weight_lower_cap, weight_upper_cap)
...     160      : (     47.2       ,      57.6       )
... }

В приведенном выше словаре клавиши являются высоты, а значения являются кортежими нижнего и верхнего предела идеального веса соответственно.

Если кто-то ниже идеального веса для их соответствующей высоты, они «тонкие». Если кто-то выше идеального веса для их соответствующей высоты, они «ожирением». Если кто-то находится в диапазоне идеального веса для их соответствующей высоты, они «подходят».

Давайте создадим функцию, которую можно использовать в Применить () Метод, который берет все строки один за другим.

>>> def fitness_check(seq):
...     if seq.loc['Sex'] == 'M':
...         if (seq.loc['weight(kgs)'] > male_fitness[seq.loc['height(cms)']][0]) & (seq.loc['weight(kgs)'] < male_fitness[seq.loc['height(cms)']][1]):
...             return "Fit"
...         elif (seq.loc['weight(kgs)'] < male_fitness[seq.loc['height(cms)']][0]):
...             return "Thin"
...         else:
...             return "Obese"
...     else:
...         if (seq.loc['weight(kgs)'] > female_fitness[seq.loc['height(cms)']][0]) & (seq.loc['weight(kgs)'] < female_fitness[seq.loc['height(cms)']][1]):
...             return "Fit"
...         elif (seq.loc['weight(kgs)'] < female_fitness[seq.loc['height(cms)']][0]):
...             return "Thin"
...         else:
...             return "Obese"

Функция возвращает, является ли данный человек «подходит» или «тонким» или «ожирением». Он использует различные словари фитнеса критериев для мужчин и женщин, созданных выше.

Наконец, давайте применим вышеуказанную функцию для каждой строки, используя Применить () метод;

>>> data.apply(fitness_check, axis=1)
Name
Edward         Fit
Natalie      Obese
Chris M        Fit
Priyatham     Thin
dtype: object

Из приведенного выше результата мы узнали, кто подходит или худой или ожирением.

Используя Применить () Метод, когда вы хотите достичь некоторой сложной функциональности, предпочтителен и рекомендуется. В основном встроенные функции агрегации в пандах пригодятся. Если вам понравилось это руководство по Применить () Функция и как обучение на основе викторины, пожалуйста, подумайте о том, чтобы попробовать прочитать наш Кофе-брейк Пандас книга.

Оригинал: “https://blog.finxter.com/pandas-apply-a-helpful-illustrated-guide/”