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