Spec-Zone.ru › pandas 1

pandas.core.groupby.GroupBy.apply

GroupBy.apply(func, *args, **kwargs)[source]

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

Функция, переданная в func, должна принимать в качестве первого аргумента DataFrame и возвращать DataFrame, Series или скалярное значение. apply затем позаботится об объединении результатов обратно в один DataFrame или Series. apply поэтому является очень гибким методом группировки.

Хотя apply является очень гибким методом, его недостатком является то, что его использование может быть значительно медленнее, чем использование более специфичных методов, таких как agg или transform. Pandas предлагает широкий спектр методов, которые будут намного быстрее, чем использование apply для их конкретных целей, поэтому старайтесь использовать их, прежде чем прибегать к apply.

Параметры
func:callable

Вызываемый объект, который принимает DataFrame в качестве первого аргумента и возвращает DataFrame, Series или скалярное значение. Кроме того, вызываемый объект может принимать позиционные и именованные аргументы.

args, kwargs:tuple и dict

Необязательные позиционные и именованные аргументы, которые нужно передать в func.

Возвращает
applied:Series или DataFrame

См. также

pipe

Применить функцию ко всему объекту GroupBy вместо каждой группы.

aggregate

Применить агрегирующую функцию к объекту GroupBy.

transform

Применить функцию столбец за столбцом к объекту GroupBy.

Series.apply

Применить функцию к Series.

DataFrame.apply

Применить функцию к каждой строке или столбцу DataFrame.

Примечания

Изменено в версии 1.3.0: Тип результата будет соответствовать возвращаемому значению переданной func, см. примеры ниже.

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

Примеры

>>> df = pd.DataFrame({'A': 'a a b'.split(),
...                    'B': [1,2,3],
...                    'C': [4,6,5]})
>>> g1 = df.groupby('A', group_keys=False)
>>> g2 = df.groupby('A', group_keys=True)

Обратите внимание, что g1 имеют g2 две группы, a и b, и различаются только своим аргументом group_keys. Вызов apply различными способами, мы можем получить разные результаты группировки:

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

>>> g1[['B', 'C']].apply(lambda x: x / x.sum())
          B    C
0  0.333333  0.4
1  0.666667  0.6
2  1.000000  1.0

В приведенном выше примере группы не являются частью индекса. Мы можем включить их, используя g2 , где group_keys=True:

>>> g2[['B', 'C']].apply(lambda x: x / x.sum())
            B    C
A
a 0  0.333333  0.4
  1  0.666667  0.6
b 2  1.000000  1.0

Пример 2: функция, переданная в apply, принимает DataFrame в качестве аргумента и возвращает Series. apply объединяет результат для каждой группы в новый DataFrame.

Изменено в версии 1.3.0: Тип результата будет соответствовать возвращаемому значению переданной func.

>>> g1[['B', 'C']].apply(lambda x: x.astype(float).max() - x.min())
     B    C
A
a  1.0  2.0
b  0.0  0.0
>>> g2[['B', 'C']].apply(lambda x: x.astype(float).max() - x.min())
     B    C
A
a  1.0  2.0
b  0.0  0.0

Аргумент group_keys здесь не оказывает никакого влияния, потому что результат не индексируется (т.е. преобразование) по сравнению со входом.

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

>>> g1.apply(lambda x: x.C.max() - x.B.min())
A
a    5
b    2
dtype: int64

© 2008–2022, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
Licensed under the 3-clause BSD License.
https://pandas.pydata.org/pandas-docs/version/1.5.0/reference/api/pandas.core.groupby.GroupBy.apply.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API