Автор оригинала: 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 возможных значения;
Ось = 0
– Применить функцию для нескольких столбцовось = 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/”