"""Melt (unpivot) para datos tabulares list[dict].""" def melt( rows: list[dict], id_vars: list[str], value_vars: list[str] | None = None, var_name: str = "variable", value_name: str = "value", ) -> list[dict]: """Convierte columnas en filas (formato largo). Inversa de pivot. Cada combinacion de id_vars + value_var genera una fila nueva. Si value_vars es None, se usan todas las columnas que no esten en id_vars. Args: rows: Lista de dicts en formato ancho. id_vars: Columnas que se mantienen como identificadores en cada fila. value_vars: Columnas a convertir en filas. None = todas las no-id. var_name: Nombre de la columna que contendra los nombres de variables. value_name: Nombre de la columna que contendra los valores. Returns: Lista de dicts en formato largo con una fila por combinacion id+variable. """ result = [] for row in rows: # Determinar que columnas derretir if value_vars is None: vars_to_melt = [k for k in row if k not in id_vars] else: vars_to_melt = value_vars for var in vars_to_melt: new_row: dict = {k: row.get(k) for k in id_vars} new_row[var_name] = var new_row[value_name] = row.get(var) result.append(new_row) return result