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