ti-enxame.com

pandas função de agregação personalizada

Eu tenho um pandas dataframe, no qual o seguinte comando funciona:

house.groupby(['place_name'])['index_nsa'].agg(['first','last'])

Isso me dá o que eu quero. Agora, quero criar um valor de agregação personalizado que me dê a alteração percentual entre o primeiro e o último valor.

Ocorreu um erro ao fazer cálculos nos valores, então assumi que precisava transformá-los em números.

house.groupby(['place_name'])['index_nsa'].agg({"change in %":[(int('last')-int('first')/int('first')]})

Infelizmente, só recebo um erro de sintaxe no último colchete, que não consigo encontrar o erro.

Alguém vê onde eu errei?

1
hmmmbob

Você precisará definir e passar um retorno de chamada para agg aqui. Você pode fazer isso de acordo com uma função lambda:

house.groupby(['place_name'])['index_nsa'].agg([
    ("change in %", lambda x: (x.iloc[-1] - x.iloc[0]) / x.iloc[0])])

Observe atentamente a chamada .agg - para permitir renomear a coluna de saída, você deve passar uma lista de tuplas do formato [(new_name, agg_func), ...]. Mais informações aqui .

Se você quiser evitar o lambda ao custo de alguma verbosidade, use

def first_last_pct(ser):
    first, last = ser.iloc[0], ser.iloc[-1]
    return (last - first) / first

house.groupby(['place_name'])['index_nsa'].agg([("change in %", first_last_pct)])
1
cs95