Función df.stack()

Pandas 常用函数Funciones comunes de Pandas


df.stack()Es un método miembro de DataFrame, utilizado paraconvertir índices de columnas en índices de filasApila las columnas de datos en formato ancho en filas, produciendo un Series o DataFrame con índice jerárquico.

Esta es una operación importante de remodelación de datos, generalmente se usa junto conunstack()para lograr la conversión mutua de datos.

Definición de la palabra: stackSignifica "apilar, amontonar"; aquí se refiere a "apilar" los datos de las columnas en filas, convirtiendo una tabla ancha en una tabla larga.


Sintaxis básica y parámetros

df.stack()Es un método de instancia de DataFrame, invocado mediante el operador punto.

Formato de sintaxis

DataFrame.stack(level=-1, dropna=True)

Descripción de parámetros

  • Parámetro: level
    • Tipo: int, str, lista de int o lista de str.
    • Descripción: Especifica el nivel a apilar. Para índices multinivel, se puede especificar el número de nivel concreto (comenzando desde 0) o el nombre del nivel. El valor predeterminado es -1, que indica el nivel más interno.
  • Parámetro: dropna
    • Tipo: valor booleano.
    • Descripción: Indica si se eliminan las filas que son completamente NaN en el resultado. El valor predeterminado es True, es decir, elimina las filas que contienen solo valores NaN.

Descripción de la función

  • Valor de retorno: Devuelve un Series o DataFrame. Si solo se apila una columna del DataFrame original, devuelve un Series; de lo contrario, devuelve un DataFrame.
  • Efecto: Convierte los índices de columnas en índices de filas, generando un formato de datos más largo. Los datos apilados están en "formato largo", lo que facilita el análisis estadístico o la visualización.

Ejemplos

Vamos a dominar completamente, a través de una serie de ejemplos de simples a complejos,df.stack()el uso de la función.

Ejemplo 1: Uso básico - Convertir columnas en filas

Ejemplo

import pandas as pd
import numpy as np

# 1. Crear datos en formato ancho (una columna por trimestre)
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'Q1': [100, 150, 200],
    'Q2': [120, 160, 210],
    'Q3': [130, 170, 220]
})

print("=== Datos originales en formato ancho ===")
print(df)
print(f"Nombres de columnas: {df.columns.tolist()}")

# 2. Usar df.stack() para convertir columnas en filas
stacked = df.stack()
print("n=== Resultado de df.stack() ===")
print(stacked)
print(f"nTipo: {type(stacked)}")

# 3. Convertir el resultado a DataFrame para visualizarlo
print("n=== Convertir a DataFrame ===")
stacked_df = stacked.reset_index()
stacked_df.columns = ['name', 'quarter', 'sales']
print(stacked_df)

Resultado esperado de la ejecución:

=== 原始宽格式数据 ===
      name  Q1   Q2   Q3
0    Alice  100  120  130
1      Bob  150  160  170
2  Charlie  'Q2', 'Q3'], columns=['name', 'quarter', 'sales']
...

Análisis del código:

  1. Los datos originales están en formato ancho; Q1, Q2 y Q3 son tres columnas de datos trimestrales.
  2. stack()Las tres columnas Q1, Q2 y Q3 se "apilan" en filas.
  3. El resultado es de tipo Series, con dos niveles de índice: el externo es el índice de filas original, el interno es el nombre de las columnas originales (trimestres).
  4. Después de apilar, los datos se convierten en "formato largo", con un solo valor trimestral por fila.

Ejemplo 2: Apilamiento de índices de columnas multinivel

Cuando un DataFrame tiene índices de columnas multinivel, se puede especificar qué nivel apilar.

Ejemplo

import pandas as pd
import numpy as np

# 1. Crear datos con índices de columnas multinivel
# Nivel externo: tipo de producto (Electronics, Furniture)
# Nivel interno: trimestre (Q1, Q2)
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=['Product', 'Quarter'])
)

print("=== Datos originales (índices de columnas multinivel) ===")
print(df)
print(f"Niveles del índice de columnas: {df.columns.names}")

# 2. Apilar las columnas del nivel interno (predeterminado, level=-1)
print("n=== Apilar columnas del nivel interno (level=-1) ===")
stacked_inner = df.stack()
print(stacked_inner)

# 3. Apilar las columnas del nivel externo
print("n=== Apilar columnas del nivel externo (level=0) ===")
stacked_outer = df.stack(level=0)
print(stacked_outer)

# 4. Apilar todas las columnas (produce un formato más largo)
print("n=== Apilar todas las columnas ===")
stacked_all = df.stack(level=[0, 1])
print(stacked_all)

Resultado esperado de la ejecución:

=== 原始数据(多层列索引)===
Product      Electronics   Furniture
Quarter              Q1   Q2      Q1   Q
...

Análisis del código:

  • En un DataFrame con índices de columnas multinivel, los nombres de columna son tuplas: (Product, Quarter).
  • level=-1(Predeterminado) Apila el nivel más interno, es decir, el nivel Quarter; el resultado conserva Product como columna.
  • level=0Apila el nivel externo, es decir, el nivel Product; el resultado conserva Quarter como columna.
  • Esta flexibilidad te permite elegir el nivel a apilar según las necesidades del análisis.

Ejemplo 3: Manejo de valores faltantes

Usadropnael parámetro para controlar el manejo de valores faltantes.

Ejemplo

import pandas as pd
import numpy as np

# 1. Crear datos que contengan valores faltantes
df = pd.DataFrame({
    'name': ['Alice', 'Bob'],
    'Math': [100, np.nan],
    'English': [90, 85],
    'Science': [np.nan, 95]
})

print("=== Datos originales (con valores faltantes) ===")
print(df)

# 2. dropna=True (predeterminado), elimina las filas que son completamente NaN
print("n=== dropna=True (predeterminado) ===")
stacked_drop = df.stack(dropna=True)
print(stacked_drop)

# 3. dropna=False, conserva los valores NaN
print("n=== dropna=False ===")
stacked_keep = df.stack(dropna=False)
print(stacked_keep)

# 4. Aplicación práctica: organizar el resultado apilado en un formato largo analizable
print("n=== Organizar como DataFrame en formato largo ===")
result = df.set_index('name').stack().reset_index()
result.columns = ['name', 'subject', 'score']
print(result)

# 5. Eliminar valores faltantes
result_clean = result.dropna()
print("n=== Después de eliminar valores faltantes ===")
print(result_clean)

Resultado esperado de la ejecución:

=== 原始数据(包含缺失值)===
   name  Math  English  Science
0  Alice  100.0     90.0      NaN
1    Bob    NaN    85.0     95.0
2=== 堆叠内层列 (level=-1) ===
Store_A  Electronics  Q1    100
                  Q2    110
         Furniture   Q1    200
                  Q2    210
Store_B  Electronics  Q1    150
 ...

Análisis del código:

  • dropna=True(Predeterminado) elimina las filas donde todos los valores son NaN.
  • En el análisis de datos, normalmente se deben conservar los datos originales y luego eliminar los valores faltantes según sea necesario.
  • Después de apilar, usarreset_index()puede convertir el índice jerárquico en columnas ordinarias, lo que facilita el procesamiento posterior.

Ejemplo 4: Uso combinado de stack y unstack

stack()yunstack()Son operaciones inversas entre sí; usadas juntas permiten remodelar los datos de forma flexible.

Ejemplo

import pandas as pd

# 1. Crear los datos iniciales
df = pd.DataFrame({
    'product': ['A', 'B', 'C'],
    'North': [100, 150, 200],
    'South': [180, 170, 160],
    'East': [190, 200, 210]
})

print("=== Datos originales ===")
print(df)

# 2. Usar unstack para convertir la región en columnas (primero convertir a índice multinivel)
df_indexed = df.set_index('product')
print("n=== Después de establecer el índice ===")
print(df_indexed)

# 3. Usar stack para convertir columnas en filas (stack es la operación inversa de unstack)
print("n=== Ida y vuelta de unstack + stack ===")
# Primero unstack
unstacked = df_indexed.unstack()
print("Resultado de unstack:")
print(unstacked)
# Luego stack de vuelta
restacked = unstacked.stack()
print("nstack de vuelta:")
print(restacked)

# 4. Ejemplo completo: crear un índice multinivel y luego convertir
print("n=== Conversión de índice multinivel ===")
# Crear DataFrame con índice multinivel
multi_df = pd.DataFrame(
    [[100, 110], [150, 160]],
    index=pd.MultiIndex.from_tuples([('A', '2023'), ('B', '2023')], names=['product', 'year']),
    columns=['North', 'South']
)
print("Datos originales con índice multinivel:")
print(multi_df)

# unstack year
print("nunstack year:")
print(multi_df.unstack(level='year'))

# unstack columns
print("nunstack columns (convertir a columnas):")
print(multi_df.unstack(level='columns'))

Resultado esperado de la ejecución:

=== unstack + stack 往返 ===
unstack 结果:
       product
North  A          100
       B          150
       C          200
South  A          180
       B          170
...

Análisis del código:

  • stack()Convierte los índices de columnas en índices de filas, transformando una tabla ancha en una tabla larga.
  • unstack()Convierte los índices de filas en índices de columnas, transformando una tabla larga en una tabla ancha.
  • Al usarlos juntos, se puede transformar la forma de los datos de manera arbitraria.
  • Para el análisis de datos, es muy importante comprender la relación inversa entre estas dos operaciones.

Sugerencia: stack()yunstack()Es una herramienta central para la remodelación de datos.stack()"Apila" las columnas en filas (de ancho a largo),unstack()"descompone" las filas en columnas (de largo a ancho).

Pandas 常用函数Funciones comunes de Pandas

Otras extensiones