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.

Pandas: Organizar la agregación de groupby

Realmente tengo dificultades para ordenar la tabla nuevamente en un dataframe “normal” después de haber agregado algo. Tenía una tabla como esta (columnas):

RnnSize     EmbSize     RnnLayer    Epochs  Alpha   Eval    Run     Result

Así que calculé el promedio y la desviación estándar de la columna Resultado sobre múltiples ejecuciones utilizando el siguiente comando:

df.groupby(["RnnSize", "EmbSize", "RnnLayer", "Epochs", "Alpha", "Eval"]).agg({'Result': ['mean', 'std']})

La salida es un DataFrame como este:

                                                             Result
                                                             mean   std
RnnSize     EmbSize     RnnLayer    Epochs  Alpha   Eval        

Parece tener tres niveles.

La función df.columns muestra el siguiente MultiIndex:

MultiIndex([(   'index',    ''),
            ( 'RnnSize',    ''),
            ( 'EmbSize',    ''),
            ('RnnLayer',    ''),
            (  'Epochs',    ''),
            (   'Alpha',    ''),
            (    'Eval',    ''),
            (  'Result', 'std'),
            (  'Result', 'std')],
           )

¿Cómo puedo aplanar esto nuevamente, eliminando “Resultado” y colocando mean y std en el mismo “nivel” que el resto? Hay muchos comandos como reset_index, drop_level, etc., pero todavía no he descubierto cómo solucionarlo. Me confunde bastante.

Edit: Para reproducibilidad, aquí está el código completo:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

dfRuns = pd.read_csv("Results.csv", encoding="utf-8")
dfRuns

dfAv = dfRuns.copy()
dfAv = dfAv.groupby(["RnnSize", "EmbSize", "RnnLayer", "Epochs", "Alpha", "Eval"]).agg({'Result': ['mean', 'std']})

Y el archivo csv (acortado) Results.csv:

none
RnnSize,EmbSize,RnnLayer,Epochs,Alpha,Eval,Run,Result
128,200,2,150,0.1,Precision,1,0.5940
128,200,2,150,0.1,Recall,1,0.5038
128,200,2,150,0.1,F1,1,0.5144
128,200,2,150,0.1,Precision,2,0.5851
128,200,2,150,0.1,Recall,2,0.4995
128,200,2,150,0.1,F1,2,0.5082
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para aplanar el multiíndice en el DataFrame de salida, puedes utilizar el método reset_index seguido de una comprensión de lista que aplane los nombres de las columnas. Aquí tienes un ejemplo de cómo hacerlo:

    df_av_flat = dfAv.reset_index()
    df_av_flat.columns = [f'{i[0]}_{i[1]}' if i[1]!='' else i[0] for i in df_av_flat.columns]
    

    El método reset_index mueve los niveles de multiíndice a columnas, y la comprensión de lista reemplaza las tuplas en el índice de columnas con cadenas concatenadas.

    El DataFrame resultante df_av_flat debería tener columnas como estas:

    RnnSize  EmbSize  RnnLayer  Epochs  Alpha  Eval      Result_mean  Result_std
    

    Ten en cuenta que puede que necesites ajustar los nombres de las columnas para adaptarlos a tu caso de uso específico.

Comments are closed.