pandas.core.groupby.DataFrameGroupBy.apply#
- DataFrameGroupBy.apply(функция, *args, include_groups=True, **kwargs)[источник]#
Применить функцию
funcпо группам и объединить результаты вместе.Функция, переданная в
applyдолжен принимать DataFrame в качестве первого аргумента и возвращать DataFrame, Series или скаляр.applyзатем позаботится о объединении результатов обратно в единый dataframe или series.applyпоэтому является очень гибким методом группировки.В то время как
applyявляется очень гибким методом, его недостаток в том, что его использование может быть значительно медленнее, чем использование более специфичных методов, таких какaggилиtransform. Pandas предлагает широкий набор методов, которые будут значительно быстрее, чем использованиеapplyдля их конкретных целей, поэтому попробуйте использовать их перед обращением кapply.- Параметры:
- функцияcallable
Вызываемый объект, который принимает dataframe в качестве первого аргумента и возвращает dataframe, series или скаляр. Кроме того, вызываемый объект может принимать позиционные и ключевые аргументы.
- include_groupsbool, по умолчанию True
Когда True, будет предпринята попытка применить
funcк группировкам в случае, если они являются столбцами DataFrame. Если это вызывает TypeError, результат будет вычислен без группировок. Когда False, группировки будут исключены при примененииfunc.Добавлено в версии 2.2.0.
Устарело с версии 2.2.0: Установка include_groups в True устарела. Только значение False будет разрешено в будущей версии pandas.
- args, kwargsкортеж и словарь
Необязательные позиционные и ключевые аргументы для передачи в
func.
- Возвращает:
- Series или DataFrame
Смотрите также
pipeПрименить функцию ко всему объекту GroupBy вместо применения к каждой группе.
aggregateПрименить агрегирующую функцию к объекту GroupBy.
transformПрименить функцию столбец за столбцом к объекту GroupBy.
Series.applyПрименить функцию к Series.
DataFrame.applyПрименить функцию к каждой строке или столбцу DataFrame.
Примечания
Изменено в версии 1.3.0: Результирующий dtype будет отражать возвращаемое значение переданной
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: Результирующий dtype будет отражать возвращаемое значение переданной
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
The
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