Spec-Zone.ru › pandas 2

pandas.core.groupby.DataFrameGroupBy.apply

DataFrameGroupBy.apply(func, *args, include_groups=True, **kwargs)[source]

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

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

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

Parameters:
func:callable

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

include_groups:bool, по умолчанию True

Если True, попытается применить func к группам в случае, если они являются столбцами DataFrame. Если это вызовет TypeError, результат будет вычислен без групп. Если False, группы будут исключены при применении func.

В версии 2.2.0.

Устарело начиная с версии 2.2.0: Установка include_groups в True устарела. В будущей версии pandas будет разрешено только значение False.

args, kwargs:tuple and dict

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

Returns:
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(), include_groups=False)
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/2.2.2/reference/api/pandas.core.groupby.DataFrameGroupBy.apply.html

Spec-Zone.ru

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