Función pd.melt() de Pandas

Pandas 常用函数Funciones comunes 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

import pandas as pd

# 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:

  1. 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.
  2. id_vars=['name']Se especifica que la columna name permanezca sin cambios, como identificador.
  3. value_vars=['Q1_sales', 'Q2_sales', 'Q3_sales']Se especifican las columnas que se van a fundir.
  4. En el resultado se agregan la columna variable (que almacena los nombres de columnas originales) y la columna value (que almacena los valores correspondientes).
  5. Usandovar_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

import pandas as pd

# 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 especificarvalue_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

import pandas as pd

# 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.
  • Usandoignore_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

import pandas as pd

# 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.
  • Usandoid_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

import pandas as pd

# 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.

Consejo: 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.

Pandas 常用函数Funciones comunes de Pandas

Otras extensiones