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.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para resolver el problema, puedes modificar y simplificar la función row_sum de la siguiente manera:

    def row_sum(group):
        group['B'] = group['A'] / group['A'].sum()
        return group
    

    Esta función toma cada grupo del DataFrame, calcula la suma de la columna ‘A’ para cada grupo, divide cada valor de ese grupo por su suma y finalmente agrega una nueva columna ‘B’ con el resultado. Devuelve el grupo modificado.

    Luego puedes usar el método apply en el DataFrame agrupado para aplicar esta función a cada grupo:

    df.groupby('ID').apply(row_sum)
    

    Esto devolverá la salida deseada:

       ID  A         B
    0   1  2  0.222222
    1   1  3  0.333333
    2   1  4  0.444444
    3   2  1  0.333333
    4   2  2  0.666667
    

    También podrías escribir una clase con un método para realizar esta tarea, de la siguiente manera:

    class GroupedDataFrame:
        def __init__(self, df):
            self.df = df
    
        def row_sum(self):
            def row_sum_helper(group):
                group['B'] = group['A'] / group['A'].sum()
                return group
            return self.df.groupby('ID').apply(row_sum_helper)
    

    Esta clase toma un DataFrame en su constructor y tiene un método row_sum que realiza la misma tarea que la función row_sum definida anteriormente. Puedes crear una instancia de la clase y llamar a su método row_sum para obtener el DataFrame modificado:

    gdf = GroupedDataFrame(df)
    gdf.row_sum()
    

    Obtendrás la misma salida que antes. Este enfoque puede ser útil si necesitas realizar esta tarea varias veces en diferentes DataFrames.

Comments are closed.