Función pd.melt() de Pandas
pd.melt()Es una función de nivel superior de la biblioteca Pandas, utilizada paraconvertir tablas anchas en tablas largasFunde los datos de formato ancho con múltiples columnas a formato largo, similar a la operación de despivotar de Excel.
Es una de las funciones más utilizadas en la remodelación de datos, especialmente útil cuando se necesita convertir los datos a formato largo antes de la visualización de datos, o cuando se combinan varias columnas en una sola.
Definición de la palabra: meltSignifica 'derretir' o 'fundir'; aquí se refiere a 'fundir' la estructura de tabla ancha en una estructura de tabla larga, similar a agrupar los datos de varias columnas.
Sintaxis básica y parámetros
pd.melt()Es una función de nivel superior de la biblioteca Pandas, utilizada para convertir datos de formato ancho a formato largo.
Formato de sintaxis
pd.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)
Descripción de parámetros
- Parámetro:
frame- Tipo: DataFrame.
- Descripción:Parámetro obligatorioDataFrame de origen, es decir, los datos que se van a convertir de ancho a largo.
- Parámetro:
id_vars- Tipo: nombre de columna, lista de tuplas o None.
- Descripción: columnas que se utilizan como identificadores (ID) y que permanecen sin cambios después de la conversión. Puede ser un nombre de columna único o una lista de nombres de columna. Si no se especifica, todas las columnas se consideran value_vars.
- Parámetro:
value_vars- Tipo: nombre de columna, lista de tuplas o None.
- Descripción: las columnas que se van a 'fundir', es decir, qué columnas se convierten en filas. Si no se especifica, todas las columnas excepto id_vars se convierten.
- Parámetro:
var_name- Tipo: cadena o None.
- Descripción: nombre de la nueva columna generada para almacenar los nombres de columnas originales. El valor predeterminado es 'variable'.
- Parámetro:
value_name- Tipo: cadena.
- Descripción: nombre de la columna de valores generada. El valor predeterminado es 'value'.
- Parámetro:
col_level- Tipo: int, str o None.
- Descripción: si las columnas son MultiIndex (índice de varios niveles), especifica el nivel que se va a fundir.
Descripción de la función
- Valor de retornoDevuelve un DataFrame con los datos convertidos de formato ancho a largo.
- EfectoFunde los valores de varias columnas en dos: una columna almacena los nombres de columnas originales (variable) y la otra almacena los valores correspondientes (value).
Ejemplos
Vamos a dominar por completo, mediante una serie de ejemplos de simples a complejos,pd.melt()el uso.
Ejemplo 1: Uso básico: convertir una tabla ancha en una tabla larga simple
Ejemplos
# 1. Crear datos en formato ancho (una columna por trimestre)
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'Q1_sales': [100, 150, 200],
'Q2_sales': [120, 160, 210],
'Q3_sales': [130, 170, 220]
})
print("=== Datos en formato ancho original ===")
print(df)
# 2. Usar pd.melt() para convertir a formato largo
melted = pd.melt(df, id_vars=['name'], value_vars=['Q1_sales', 'Q2_sales', 'Q3_sales'])
print(n=== pd.melt() Convertir a formato largo ===)
print(melted)
# 3. Personalizar nombres de columnas
melted_custom = pd.melt(
df,
id_vars=['name'],
value_vars=['Q1_sales', 'Q2_sales', 'Q3_sales'],
var_name='quarter',
value_name='sales'
)
print("n=== Nombres de columnas personalizados ===")
print(melted_custom)
Resultados esperados:
=== 原始宽格式数据 ===
name Q1_sales Q2_sales Q3_sales
0 Alice 100 120 130
1 Bob 150 160 170
2 Charlie 200 210 220
=== pd.melt() 转换为长格式 ===
name variable value
0 Alice Q1_sales 100
1 Bob Q1_sales 150
2 Charlie Q1_sales 200
3 Alice Q2_sales 120
4 Bob Q2_sales 160
5 Charlie Q2_sales 210
6 Alice Q3_sales 130
7 Bob Q3_sales 170
8 Charlie Q3_sales 220
=== 自定义列名 ===
name quarter sales
0 Alice Q1_sales 100
1 Bob Q1_sales 150
2 Charlie Q1_sales 200
3 Alice Q2_sales 200
Análisis del código:
- Los datos originales están en formato ancho, cada fila representa una persona, y Q1, Q2, Q3 son las columnas de datos de ventas de tres trimestres.
id_vars=['name']Se especifica que la columna name permanezca sin cambios, como identificador.value_vars=['Q1_sales', 'Q2_sales', 'Q3_sales']Se especifican las columnas que se van a fundir.- En el resultado se agregan la columna variable (que almacena los nombres de columnas originales) y la columna value (que almacena los valores correspondientes).
- Usando
var_nameyvalue_namese puede personalizar el nombre de las nuevas columnas.
Ejemplo 2: Sin especificar value_vars - Fundir todas las columnas excepto id_vars
Cuando no se especifica value_vars, se funden automáticamente todas las columnas excepto id_vars.
Ejemplos
# 1. Crear datos con más columnas
df = pd.DataFrame({
'id': [1, 2, 3],
'name': ['Alice', 'Bob', 'Charlie'],
'math': [90, 85, 92],
'english': [88, 90, 87],
'science': [95, 88, 91]
})
print("=== Datos originales ===")
print(df)
# 2. Solo especifica id_vars, derrite automáticamente todas las demás columnas
melted = pd.melt(df, id_vars=['id', 'name'])
print("n=== Fundir todas las columnas no id ===")
print(melted)
# 3. Caso de múltiples id_vars
print(n=== múltiples id_vars ===)
melted_multi = pd.melt(df, id_vars=['name'], value_vars=['math', 'english', 'science'])
print(melted_multi)
# 4. Usar un solo id_vars
print(n=== un id_vars ===)
melted_one = pd.melt(df, id_vars=['id'])
print(melted_one)
Resultados esperados:
=== 原始数据 === id name math english science 0 1 Alice 90 88 95 1 2 Bob 85 90 88 2 3 Charlie 92 87 91 === 融化所有非id列 === id name variable value 0 1 Alice math 90 1 2 Bob math 85 2 3 Charlie math 92 3 1 Alice english 88 4 2 融化为两列(variable 和 value)。 - 不指定 value_vars 时,系统会自动识别并熔化除 id_vars 外的所有列 - id_vars 可以是单个列或多个列的组合
Análisis del código:
- No especificar
value_varscuando no se especifica, se funden automáticamente exceptoid_varstodas las demás columnas. - Cuando solo hay id_vars y no value_vars, cada fila de datos genera un número correspondiente de nuevas filas según el número de value_vars.
- Este método es muy conveniente cuando se necesita procesar múltiples columnas de datos de manera unificada.
Ejemplo 3: Sin id_vars - Fundir todas las columnas
Cuando no se especifica id_vars, el índice de los datos originales se utiliza como identificador.
Ejemplos
# 1. Crear datos (sin columna id explícita)
df = pd.DataFrame({
'Q1': [100, 150, 200],
'Q2': [120, 160, 210],
'Q3': [130, 170, 220]
})
print("=== Datos originales ===")
print(df)
# 2. No especificar id_vars, usar el índice predeterminado
melted = pd.melt(df)
print(n=== Sin especificar id_vars ===)
print(melted)
# 3. Restaurar el índice original
print("n=== reiniciar índice ===")
melted_with_index = pd.melt(df, ignore_index=False)
print(melted_with_index)
# 4. Caso práctico: crear identificadores
df_with_id = pd.DataFrame({
'year': [2023, 2023, 2023],
'Q1': [100, 150, 200],
'Q2': [120, 160, 210]
})
print("n=== Datos originales (con año) ===")
print(df_with_id)
# Primero agregar year a id_vars
melted_year = pd.melt(df_with_id, id_vars=['year'])
print("n=== Resultado de la fusión que incluye el año ===")
print(melted_year)
Resultados esperados:
=== 原始数据 ===
Q1 Q2 Q3
0 100 120 130
1 150 160 170
2 200 210 220
=== 不指定 id_vars ===
variable value
0 Q1 100
1 Q1 150
2 融化所有列,将原始列名转为 variable 列的值,原始值转为 value 列。
Análisis del código:
- Cuando no se especifica id_vars, solo quedan las columnas variable y value.
- Usando
ignore_index=Falsese puede conservar el índice original, lo que facilita la comparación posterior con los datos originales. - En la práctica, normalmente se especifican uno o más id_vars para mantener la información clave.
Ejemplo 4: Caso práctico - Preparación para la visualización de datos
melt() es una gran ayuda para la visualización de datos; muchas bibliotecas de trazado (como Seaborn, Matplotlib) son más adecuadas para manejar datos en formato largo.
Ejemplos
# 1. Crear datos de ventas (una columna por región)
sales = pd.DataFrame({
'product': ['A', 'B', 'C', 'D'],
'Jan': [1200, 1500, 900, 1100],
'Feb': [1350, 1600, 950, 1200],
'Mar': [1100, 1450, 880, 1050]
})
print("=== Datos de ventas en formato ancho ===")
print(sales)
# 2. Derretir a formato largo (para visualización)
sales_long = pd.melt(
sales,
id_vars=['product'],
var_name='month',
value_name='sales'
)
print(n=== Datos de ventas en formato largo ===)
print(sales_long)
# 3. Ejemplo de procesamiento de datos: calcular crecimiento interanual
# Agregar número de mes
month_map = {'Jan': 1, 'Feb': 2, 'Mar': 3}
sales_long['month_num'] = sales_long['month'].map(month_map)
print("n=== Agregar número de mes ===")
print(sales_long)
# 4. Filtrar los datos de un mes específico
feb_sales = sales_long[sales_long['month'] == 'Feb']
print(n=== Datos de ventas de febrero ===)
print(feb_sales)
Resultados esperados:
=== 宽格式销售数据 === product Jan Feb Mar 0 A 1200 1350 1100 product Jan 180 170 6 === 长格式销售数据(用于可视化) === product month sales 0 A Jan 1200 1 B Jan 1500 2 C Jan 900 3 D Jan 1100 4 A Feb 1350
Análisis del código:
- Los datos en formato ancho tienen una columna por región/punto de tiempo, lo que facilita la visualización y la entrada de datos.
- Los datos en formato largo tienen una fila por observación, que es el formato estándar para el análisis estadístico.
- Bibliotecas de visualización como Seaborn aceptan datos en formato largo, lo que permite crear fácilmente gráficos de barras agrupados, gráficos de líneas, etc.
- Usando
id_varsse pueden conservar variables categóricas como producto, región, etc., sin fundir.
Ejemplo 5: Fusión de índices de columnas de varios niveles
Cuando el DataFrame tiene un índice de columnas de varios niveles, se puede utilizarcol_levelel parámetro.
Ejemplos
# 1. Crear datos con índice de columnas multinivel
df = pd.DataFrame(
[[100, 110, 200, 210], [150, 160, 180, 190]],
index=['Store_A', 'Store_B'],
columns=pd.MultiIndex.from_tuples([
('Electronics', 'Q1'), ('Electronics', 'Q2'),
('Furniture', 'Q1'), ('Furniture', 'Q2')
], names=['Category', 'Quarter'])
)
print("=== Datos originales (índice de columnas multinivel) ===")
print(df)
# 2. Derretir todas las columnas (sin especificar nivel)
print("n=== Derretir todas las columnas ===")
melted_all = pd.melt(df, ignore_index=False)
print(melted_all)
# 3. Fundir solo la capa interna (Quarter)
print("n=== Solo derretir el nivel Quarter ===")
melted_quarter = pd.melt(df, col_level=1)
print(melted_quarter)
# 4. Derretir capa externa (Category)
print("n=== Solo aplicar melt a la capa Category ===")
melted_category = pd.melt(df, col_level=0)
print(melted_category)
Resultado esperado de la ejecución:
=== 原始数据(多层列索引)=== Category Electronics Furniture Quarter Q1 Q2 Q1 融化不同层级会产生不同的结果: - 融化内层(Quarter)保留 Category 作为 id - 融化外层(Category)保留 Quarter 作为 id
Análisis del código:
- DataFrame con índice de columnas de varios niveles, los nombres de columna están en forma de tupla: (Category, Quarter).
col_level=0Aplicar melt a la capa externa (Category), conservando Quarter como id.col_level=1Aplicar melt a la capa interna (Quarter), conservando Category como id.- Esta flexibilidad te permite elegir el nivel al que aplicar melt según las necesidades de tu análisis.
Otras extensionesConsejo:
pd.melt()Es una gran ayuda para la visualización de datos. La mayoría de las librerías de gráficos (como Seaborn, Plotnine) manejan mejor los datos en formato largo; primero convertir los datos con melt() y luego graficar es una práctica común.
Funciones comunes de Pandas