Solución:
Los objetos agrupados de los pandas tienen un groupby.DataFrameGroupBy.shift
método, que cambiará una columna específica en cada grupo norte periods
, al igual que el marco de datos normal shift
método:
df['prev_value'] = df.groupby('object')['value'].shift()
Para el siguiente marco de datos de ejemplo:
print(df)
object period value
0 1 1 24
1 1 2 67
2 1 4 89
3 2 4 5
4 2 23 23
El resultado sería:
object period value prev_value
0 1 1 24 NaN
1 1 2 67 24.0
2 1 4 89 67.0
3 2 4 5 NaN
4 2 23 23 5.0
IFF su DataFrame ya está ordenado por las claves de agrupación, puede usar una sola shift
en todo el DataFrame y where
para NaN
las filas que se desbordan en el siguiente grupo. Para DataFrames más grandes con muchos grupos, esto puede ser un poco más rápido.
df['prev_value'] = df['value'].shift().where(df.object.eq(df.object.shift()))
object period value prev_value
0 1 1 24 NaN
1 1 2 67 24.0
2 1 4 89 67.0
3 2 4 5 NaN
4 2 23 23 5.0
Algunos tiempos relacionados con el rendimiento:
import perfplot
import pandas as pd
import numpy as np
perfplot.show(
setup=lambda N: pd.DataFrame({'object': np.repeat(range(N), 5),
'value': np.random.randint(1, 1000, 5*N)}),
kernels=[
lambda df: df.groupby('object')['value'].shift(),
lambda df: df['value'].shift().where(df.object.eq(df.object.shift())),
],
labels=["GroupBy", "Where"],
n_range=[2 ** k for k in range(1, 22)],
equality_check=lambda x,y: np.allclose(x, y, equal_nan=True),
xlabel="# of Groups"
)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)