Gostaria de criar três novas colunas em um dataframe pandas existente ( df
) usando a mesma lambda
função na mesma coluna, mas com uma entrada diferente. Consegui isso com as seguintes linhas de código. No entanto, gostaria de saber se há uma maneira mais rápida de produzir a mesma saída com menos linhas de código:
df["1d"] = (
df
.groupby(cols)["ln"]
.apply(lambda x: x - x.shift(1))
.values
)
df["5d"] = (
df
.groupby(cols)["ln"]
.apply(lambda x: x - x.shift(5))
.values
)
df["30d"] = (
df
.groupby(cols)["ln"]
.apply(lambda x: x - x.shift(30))
.values
)
Você tem que fazer um loop sobre as mudanças, mas pode reutilizar o agrupador:
Além disso, sua abordagem para usar
groupby.apply
+.values
está incorreta. Isso só funcionaria se as linhas já estivessem classificadas por grupo. Se você usar,groupby.shift
manterá um índice/alinhamento correto.Se você realmente precisa usar uma função personalizada, vá com
groupby.transform
:Exemplo com uma entrada fictícia e
cols = ['A', 'B']
: