3 Formas Efectivas de Unpivot en Excel, PowerQuery y Python
Comparamos cómo anular la dinamización de columnas con Excel, Powerqiery y Python. Tres formas para conseguir el mismo resultado. ¿Con cuál te quedas?
Convertir las cabeceras de columna en valores es una de esas transformaciones que aparece constantemente cuando trabajamos con datos en Excel. Partimos de una tabla con varias columnas (por ejemplo n1, n2, n3) y queremos acabar con una estructura larga donde cada cabecera se repite junto a su valor correspondiente, manteniendo las columnas fijas como el nombre y la ciudad. Esta operación se conoce como unpivot (o "anular la dinamización de columnas"), y en este tutorial la resolvemos de tres formas distintas: con funciones de Excel y LAMBDA, con Power Query y con Python dentro de Excel.
El objetivo
Tenemos una tabla con columnas fijas (nombre y ciudad) y tres columnas de valores (n1, n2, n3). Queremos transformarla para que cada uno de esos valores aparezca en una fila propia, acompañado del nombre de la columna a la que pertenecía. El resultado apila todos los datos: primero la cabecera de la primera columna con sus valores, luego la segunda y finalmente la tercera.
Opción 1: función personalizada con LAMBDA
La primera vía construye una función propia con dos parámetros: las columnas fijas y las columnas que se deben transformar. La idea es apilar todas las columnas de valores una debajo de otra y añadir el nombre de columna correspondiente.
El motor de esta lógica es la función REDUCE, que recorre una matriz acumulando un resultado:
- Se parte de un valor inicial (por ejemplo, una cadena vacía).
- Se le pasa un array (como
SECUENCIA(3)para tres columnas). - Dentro de la
LAMBDAse trabaja con el valor previo y el valor de la iteración. Tras cada paso, el resultado pasa a ser el "previo".
REDUCE no solo acumula números o textos: también permite ir generando rangos como salida. Combinándolo con varias funciones obtenemos el unpivot:
APILARVpara colocar las columnas una debajo de otra de forma vertical.ELEGIRCOLSpara escoger, en cada iteración, la columna concreta de la matriz que toca procesar (la columna indicada por el número de la iteración).- Una construcción con
SIaplicada a unaSECUENCIApara propagar un valor fijo y repetir el nombre de la cabecera tantas veces como filas tenga la columna. UsandoSECUENCIA(FILAS(...))se generan tantas repeticiones como valores haya. APILARHpara añadir de forma horizontal, en cada fila, los valores fijos, el nombre de columna repetido y el valor que corresponde, en lugar de fijar una cabecera concreta.
La función final ya preparada sigue exactamente esta lógica. Internamente desglosa las dos matrices de entrada, detecta el número de columnas a trasponer con SECUENCIA(COLUMNAS(...)) (en lugar de un 3 fijo), separa cabeceras y valores de la parte fija usando TOMAR y EXCLUIR (para quitar la primera fila), aplica la lógica línea a línea sobre las columnas a transformar y, por último, añade las cabeceras al resultado apilado.
Una vez tenemos la LAMBDA lista, podemos convertirla en una función reutilizable: copiamos la fórmula (excluyendo los datos finales de prueba), vamos a Fórmulas → Nombres definidos → Asignar nombre, le ponemos un nombre como UNPIVOTAR y pegamos la función. A partir de ahí basta con llamarla indicando la parte fija y la parte variable para obtener el resultado al instante.
Opción 2: Power Query
Power Query consigue el mismo resultado con mucho menos esfuerzo, porque la lógica ya viene integrada:
- Convertimos los datos en tabla y los cargamos en Power Query (Datos → De una tabla o rango).
- Seleccionamos las tres columnas que queremos transformar (
n1,n2,n3). - Elegimos la opción Anular la dinamización de columnas, que genera directamente el resultado buscado.
- Cerramos y cargamos, y obtenemos el resultado en formato tabla.
La gran ventaja es la rapidez: toda la lógica está condensada en una sola opción. El detalle a recordar es que, al estar conectado a la tabla origen, hay que actualizar la consulta para que recoja los cambios que hagamos en los datos. Como contrapartida positiva, el resultado se entrega ya en formato tabla.
Opción 3: Python dentro de Excel
La tercera opción usa Python en Excel, disponible de momento para el canal Insider. Se escribe código directamente en una celda con =py, lo que cambia el formato de la celda y permite introducir código.
El flujo es el siguiente:
- Referenciamos la tabla de Excel con
xl(...), que recupera el rango completo incluyendo las cabeceras. - Usamos la librería pandas (precargada y accesible como
pd) y, en concreto, la funciónpd.melt, que realiza precisamente este tipo de transformación. - A
pd.meltle indicamos: id_vars: la lista de columnas fijas, entre corchetes y comillas (por ejemplo["nombre", "ciudad"]).value_vars: la lista de columnas a transformar (["n1", "n2", "n3"]).- Ejecutamos el código con Control + Intro.
El resultado se devuelve primero como un objeto de Python. Con la opción de mostrar valores de Excel, lo vemos en las celdas exactamente igual que con los otros dos métodos. La nomenclatura y la lógica recuerdan bastante al lenguaje M de Power Query.
Conclusión
Hemos resuelto el mismo problema de unpivot por tres caminos distintos. La función con LAMBDA exige montar la lógica, pero deja una herramienta reutilizable y totalmente bajo control. Power Query es la opción más rápida y entrega el resultado en formato tabla. Python con pd.melt ofrece una solución muy compacta para quienes ya manejan pandas. Tres enfoques válidos para que elijas el que mejor encaje con tu flujo de trabajo.
Más contenido de Excel en InflueXcel
- Acumular el saldo en PIVOTARPOR: una función de agregación distinta por columna CasoNuevo caso que empieza con una suposicion razonable y acaba en una contraprueba del propio autor. Juan trae un libro mayor en bruto y quiere
- CONTAR.SI no acepta ELEGIRCOLS: por qué las funciones .SI exigen una referencia y no una matriz CasoHay errores de Excel que te mandan a buscar en la dirección equivocada, y este es de manual. Joan Recasens llega al grupo con una fórmula qu
- Dar formato a la última fila de una tabla que crece (y el techo del formato condicional) CasoUn miembro de la comunidad llega con una tabla cuyo rango real va de la columna embalaje a la columna total, y cuya columna de numeración co
- Colorear la fila entera según el técnico asignado: la referencia mixta que casi nadie aplica bien CasoEsta semana surgió una duda que parece de principiante y en realidad esconde el concepto peor entendido del formato condicional. Johann Frar
- Del VBA a una sola fórmula: calcular el RFC mexicano con LET, MAP y expresiones regulares CasoHector llega al grupo con un problema que no se ve todos los días: tiene resuelto el cálculo del RFC mexicano, pero lo tiene en VBA, y quier
- Un rango desbordado como serie de un gráfico: el nombre tiene que ser de ámbito Hoja CasoMiki llega al grupo con un caso de esos que no dan error, simplemente no funcionan. Quiere un gráfico que crezca solo: si mañana hay más dat
- Tabla de clasificación de una liga que se ordena sola: tres formas de montarla CasoDe madrugada, Hector lanzó al grupo una petición que suena sencilla y que acabó generando tres enfoques radicalmente distintos. Tiene un lib
- Conciliación contable: una sola fórmula por hoja que cuadra, descuadra y avisa CasoEsta semana alguien preguntó en el grupo si tenía sentido montarse un fichero para conciliaciones bancarias. La respuesta llegó en forma de
- Reto de Excel: El cumpleaños de Bilbo 🎂 | CONTAR.SI y SUMAR.SI desde cero (Nivel 1) TutorialEn La Comarca se celebra el cumpleaños número 111 de Bilbo Bolsón: cerveza, pasteles, fuegos artificiales… y algún curioso escondido tras el
- SUMAR COLUMNAS TABLA DINÁMICA **EN 2 CLICKS** TutorialUn truco rápido para sumar columnas en una tabla dinámica