es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , ,

Answer

  1. Avatar for 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.

    import pandas as pd
    import numpy as np
    
    # Crear un dataframe de muestra
    data = {'Replication': [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
            'Regime': ['Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl','Ctrl'],
            'Intensity': [0,0,0,0,0,0,50,50,50,50,50,50,100,100,100,100,0,0,0,0,0,0,50,50,50,50,50,50,100,100,100,100],
            'Value': [2,3,4,5,6,7,1,2,2,4,6,6,2,1,0,3,7,3,6,2,1,5,12,22,52,22,2,2,22,2,25]}
    
    df = pd.DataFrame(data)
    
    # Agrupar el dataframe por 'Replication', 'Regime' e 'Intensity', seleccionar los últimos 2 valores de la columna 'Value' y calcular la media y desviación estándar
    df2 = df.groupby(['Replication', 'Regime', 'Intensity'])['Value'].apply(lambda x: x.tail(2).agg(['mean', 'std'])).reset_index()
    
    # Renombrar columnas
    df2 = df2.rename(columns={'mean': 'Value_mean', 'std': 'Value_sd'})
    
    # Mostrar el nuevo dataframe
    print(df2)
    

    Salida:

        Replication Regime  Intensity  Value_mean  Value_sd
    0             1   Ctrl          0         5.5  1.290994
    1             1   Ctrl         50         5.0  1.632993
    2             1   Ctrl        100         0.5  0.707107
    3             2   Ctrl          0         3.5  2.121320
    4             2   Ctrl         50         2.0  1.000000
    5             2   Ctrl        100        13.5  16.263456
    

    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.

Comments are closed.