Quiero obtener el promedio únicamente de las últimas 5 filas de diferentes grupos contenidos en una columna en un dataframe, y crear un nuevo dataframe que contenga dos columnas.
Tengo un dataframe con cuatro columnas. En la columna ‘Intensidad’ hay 3 grupos (0, 50, 100). Me gustaría calcular el promedio solo de los últimos 2 valores de la columna ‘Valor’ en los 3 grupos de la columna ‘Intensidad’. Luego me gustaría crear un nuevo dataframe con las columnas ‘Replicación’, ‘Régimen’, ‘Intensidad’, ‘Valor promedio’ y ‘Valor sd’, siendo las dos últimas el promedio calculado y la desviación estándar.
Replicación Régimen Intensidad Valor
1 Ctrl 0 2
1 Ctrl 0 3
1 Ctrl 0 4
1 Ctrl 0 5
1 Ctrl 0 6
1 Ctrl 0 7
1 Ctrl 50 1
1 Ctrl 50 2
1 Ctrl 50 2
1 Ctrl 50 4
1 Ctrl 50 6
1 Ctrl 50 6
1 Ctrl 100 2
1 Ctrl 100 1
1 Ctrl 100 0
2 Ctrl 100 3
2 Ctrl 0 7
2 Ctrl 0 3
2 Ctrl 0 6
2 Ctrl 0 2
2 Ctrl 0 1
2 Ctrl 0 5
2 Ctrl 50 12
2 Ctrl 50 22
2 Ctrl 50 52
2 Ctrl 50 22
2 Ctrl 50 2
2 Ctrl 50 2
2 Ctrl 100 22
2 Ctrl 100 2
2 Ctrl 100 25
Hasta ahora he utilizado la función apply
, pero no obtengo un dataframe sino una serie.
df2 = df1.groupby(['Régimen','Intensidad']).apply(lambda x:
x.tail(3).mean(axis=0,level=0))
y obtengo
Intensidad A
Régimen Intensidad
Ctrl 0 0 -0.87
50 50 2.08
100 100 4.84
davy.ai
Para crear un nuevo dataframe con las columnas ‘Replication’, ‘Regime’, ‘Intensity’, ‘Value_mean’ y ‘Value_sd’, necesitamos modificar la función apply para calcular la desviación estándar y devolver un dataframe en lugar de una serie.
Salida:
El nuevo dataframe tiene las columnas solicitadas ‘Replication’, ‘Regime’, ‘Intensity’, ‘Value_mean’ y ‘Value_sd’. La media y la desviación estándar se calculan solo para los últimos 2 valores de la columna ‘Value’ en los 3 grupos de la columna ‘Intensity’. La función reset_index() se utiliza para convertir el dataframe agrupado en un dataframe regular.