Есть ли встроенный в pandas способ применения двух разных агрегатных функций f1, f2
к одному и тому же столбцу df["returns"]
без необходимости вызывать agg()
несколько раз?
Пример фрейма данных:
import pandas as pd
import datetime as dt
pd.np.random.seed(0)
df = pd.DataFrame({
"date" : [dt.date(2012, x, 1) for x in range(1, 11)],
"returns" : 0.05 * np.random.randn(10),
"dummy" : np.repeat(1, 10)
})
Синтаксически неправильный, но интуитивно правильный способ сделать это:
# Assume `f1` and `f2` are defined for aggregating.
df.groupby("dummy").agg({"returns": f1, "returns": f2})
Очевидно, Python не допускает дублирования ключей. Есть ли другой способ выразить свой вклад agg()
? Может быть, [(column, function)]
лучше подойдет список кортежей , позволяющий применять несколько функций к одному столбцу? Но agg()
похоже, что он принимает только словарь.
Есть ли обходной путь для этого, кроме определения вспомогательной функции, которая просто применяет обе функции внутри нее? (Как это вообще будет работать с агрегацией?)
Ответы:
Вы можете просто передать функции в виде списка:
или как словарь:
источник
TLDR; Pandas
groupby.agg
имеет новый, более простой синтаксис для указания (1) агрегатов для нескольких столбцов и (2) множественных агрегатов для столбца. Итак, чтобы сделать это для панд> = 0,25 , используйтеИЛИ
Pandas> = 0.25: именованная агрегация
Pandas изменил поведение
GroupBy.agg
в пользу более интуитивного синтаксиса для указания именованных агрегатов. См. Раздел документации 0.25 по улучшениям, а также соответствующие проблемы GitHub GH18366 и GH26512 .Из документации,
Теперь вы можете передать кортеж через аргументы ключевого слова. Кортежи соответствуют формату
(<colName>, <aggFunc>)
.В качестве альтернативы вы можете использовать
pd.NamedAgg
(по сути именованный кортеж), который делает вещи более явными.Для Series это еще проще, просто передайте aggfunc аргументу ключевого слова.
Наконец, если имена ваших столбцов не являются действительными идентификаторами Python, используйте словарь с распаковкой:
Панды <0,25
В более поздних версиях pandas, предшествующих 0.24, при использовании словаря для указания имен столбцов для вывода агрегации вы получите
FutureWarning
:Использование словаря для переименования столбцов не рекомендуется в версии 0.20. В более поздних версиях pandas это можно указать проще, передав список кортежей. При указании функций таким образом, все функции для этого столбца должны быть указаны как кортежи пар (имя, функция).
Или,
источник
df.groupby('kind')['height']
?df.groupby("kind").agg(**{ 'max height': pd.NamedAgg(column='height', aggfunc=max), 'min weight': pd.NamedAgg(column='weight', aggfunc=min) })
Было бы что-то вроде этой работы:
источник
aggregate
ней явно указано, что приdict
передаче ключа ключи должны быть именами столбцов. Итак, либо ваш пример - это то, что вы ввели, не проверив наличие этой ошибки, либо Pandas нарушает здесь свои собственные документы.returns
. Так это серийная версия агрегата? Я хочу создать агрегатную версию DataFrame и хочу сразу применить несколько разных агрегатов к каждому столбцу.