Existe uma maneira interna de pandas para aplicar duas funções agregadoras diferentes f1, f2
na mesma coluna df["returns"]
, sem precisar chamar agg()
várias vezes?
Exemplo de quadro de dados:
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)
})
A maneira sintaticamente errada, mas intuitivamente correta, de fazer isso seria:
# Assume `f1` and `f2` are defined for aggregating.
df.groupby("dummy").agg({"returns": f1, "returns": f2})
Obviamente, Python não permite chaves duplicadas. Existe alguma outra maneira de expressar a entrada agg()
? Talvez uma lista de tuplas [(column, function)]
funcionasse melhor, para permitir várias funções aplicadas à mesma coluna? Mas agg()
parece que só aceita um dicionário.
Existe uma solução alternativa para isso, além de definir uma função auxiliar que apenas aplique as duas funções dentro dela? (Como isso funcionaria com a agregação, afinal?)
Respostas:
Você pode simplesmente passar as funções como uma lista:
ou como um dicionário:
fonte
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 , useOU
Pandas> = 0.25: Agregação Nomeada
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,
Agora você pode passar uma tupla por meio de argumentos de palavra-chave. As tuplas seguem o formato de
(<colName>, <aggFunc>)
.Como alternativa, você pode usar
pd.NamedAgg
(essencialmente um nome nomeado) que torna as coisas mais explícitas.É ainda mais simples para o Series, basta passar o aggfunc para um argumento de palavra-chave.
Por fim, se os nomes das colunas não forem identificadores python válidos, use um dicionário com descompactação:
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
: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).
Ou,
fonte
df.groupby('kind')['height']
?df.groupby("kind").agg(**{ 'max height': pd.NamedAgg(column='height', aggfunc=max), 'min weight': pd.NamedAgg(column='weight', aggfunc=min) })
Algo assim funcionaria:
fonte
aggregate
ela diz explicitamente que, quando adict
é passada, as chaves devem ser nomes de colunas. Portanto, seu exemplo é algo que você digitou sem verificar esse erro, ou então o Pandas quebra seus próprios documentos aqui.returns
lá. Portanto, esta é a versão em série do agregado? Estou procurando fazer a versão do DataFrame de agregação e quero aplicar várias agregações diferentes a cada coluna ao mesmo tempo.