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
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: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:Ten en cuenta que puede que necesites ajustar los nombres de las columnas para adaptarlos a tu caso de uso específico.