TLDR; O Pandas groupby.agg
possui uma sintaxe nova e mais fácil para especificar (1) agregações em várias colunas e (2) várias agregações em uma coluna. Portanto, para fazer isso em pandas> = 0,25 , use
df.groupby('dummy').agg(Mean=('returns', 'mean'), Sum=('returns', 'sum'))
Mean Sum
dummy
1 0.036901 0.369012
OU
df.groupby('dummy')['returns'].agg(Mean='mean', Sum='sum')
Mean Sum
dummy
1 0.036901 0.369012
O Pandas mudou o comportamento GroupBy.agg
em favor de uma sintaxe mais intuitiva para especificar agregações nomeadas. Consulte a seção de documentos de 0,25 sobre aprimoramentos , além dos problemas relevantes do GitHub GH18366 e GH26512 .
A partir da documentação,
Para oferecer suporte à agregação específica de coluna com controle sobre os nomes das colunas de saída, o pandas aceita a sintaxe especial GroupBy.agg()
, conhecida como "agregação nomeada", em que
- As palavras-chave são os nomes das colunas de saída
- Os valores são tuplas cujo primeiro elemento é a coluna a ser selecionada e o segundo elemento é a agregação a ser aplicada a essa coluna. O Pandas fornece os pandas.NamedAgg nomeadopleu com os campos ['column', 'aggfunc'] para deixar mais claro quais são os argumentos. Como de costume, a agregação pode ser um alias que pode ser chamado ou de sequência.
Agora você pode passar uma tupla por meio de argumentos de palavra-chave. As tuplas seguem o formato de (<colName>, <aggFunc>)
.
import pandas as pd
pd.__version__
# '0.25.0.dev0+840.g989f912ee'
# Setup
df = pd.DataFrame({'kind': ['cat', 'dog', 'cat', 'dog'],
'height': [9.1, 6.0, 9.5, 34.0],
'weight': [7.9, 7.5, 9.9, 198.0]
})
df.groupby('kind').agg(
max_height=('height', 'max'), min_weight=('weight', 'min'),)
max_height min_weight
kind
cat 9.5 7.9
dog 34.0 7.5
Como alternativa, você pode usar pd.NamedAgg
(essencialmente um nome nomeado) que torna as coisas mais explícitas.
df.groupby('kind').agg(
max_height=pd.NamedAgg(column='height', aggfunc='max'),
min_weight=pd.NamedAgg(column='weight', aggfunc='min')
)
max_height min_weight
kind
cat 9.5 7.9
dog 34.0 7.5
É ainda mais simples para o Series, basta passar o aggfunc para um argumento de palavra-chave.
df.groupby('kind')['height'].agg(max_height='max', min_height='min')
max_height min_height
kind
cat 9.5 9.1
dog 34.0 6.0
Por fim, se os nomes das colunas não forem identificadores python válidos, use um dicionário com descompactação:
df.groupby('kind')['height'].agg(**{'max height': 'max', ...})
Pandas <0,25
Nas versões mais recentes dos pandas anteriores a 0,24, se você estiver usando um dicionário para especificar nomes de colunas para a saída de agregação, obterá FutureWarning
:
df.groupby('dummy').agg({'returns': {'Mean': 'mean', 'Sum': 'sum'}})
# FutureWarning: using a dict with renaming is deprecated and will be removed
# in a future version
O uso de um dicionário para renomear colunas foi descontinuado na v0.20. Nas versões mais recentes dos pandas, isso pode ser especificado mais simplesmente passando uma lista de tuplas. Se você especificar as funções dessa maneira, todas as funções dessa coluna deverão ser especificadas como tuplas de pares (nome, função).
df.groupby("dummy").agg({'returns': [('op1', 'sum'), ('op2', 'mean')]})
returns
op1 op2
dummy
1 0.328953 0.032895
Ou,
df.groupby("dummy")['returns'].agg([('op1', 'sum'), ('op2', 'mean')])
op1 op2
dummy
1 0.328953 0.032895