Función df.stack()
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 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:
- Los datos originales están en formato ancho; Q1, Q2 y Q3 son tres columnas de datos trimestrales.
stack()Las tres columnas Q1, Q2 y Q3 se "apilan" en filas.- 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).
- 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 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 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, usar
reset_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
# 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.
Otras extensionesSugerencia:
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).
Funciones comunes de Pandas