Pandas Index (índice)

El Index (índice) es un componente central de la estructura de datos de Pandas; determina la organización y el modo de acceso a los datos. Pandas admite varios tipos de índices, desde el simple RangeIndex hasta el complejo índice multinivel (MultiIndex). Esta sección presentará en detalle cómo usar los distintos tipos de índice.


Conceptos básicos de Index

Index es similar a la clave primaria de una base de datos o al número de fila de Excel; se usa para identificar de manera única cada fila de datos. DataFrame tiene dos partes: el índice de filas (index) y el índice de columnas (columns).

Ejemplo

import pandas as pd

# Crear un DataFrame simple (usa RangeIndex por defecto)
df = pd.DataFrame({
    "Nombre": ["Ana", "Luis", "Carlos"],
    "Edad": [25, 30, 28],
    "Ciudad": ["Beijing", "Shanghái", "Guangzhou"]
})

print("Información del DataFrame:")
print(f"Índice de filas: {df.index.tolist()}")
print(f"Índice de columnas: {df.columns.tolist()}")
print("\nDatos:")
print(df)

RangeIndex

RangeIndex es el índice entero por defecto, similar al de Pythonrange(n), que comienza en 0 y se incrementa.

Creación y uso

Ejemplo

import pandas as pd

# Crear RangeIndex
idx = pd.RangeIndex(start=0, stop=10, step=1)
print(f"RangeIndex: {idx}")
print(f"Tipo: {type(idx)}")

# DataFrame usa RangeIndex por defecto
df = pd.DataFrame({"A": [1, 2, 3]}, index=range(3))
print(f"\nTipo de índice por defecto: {type(df.index)}")

# Después de restablecer el índice, también devuelve RangeIndex
df_reset = df.reset_index()
print(f"Tipo de índice después de restablecer: {type(df_reset.index)}")

Características de RangeIndex

  • Ocupación mínima de memoria
  • Soporta acceso por posición entera por defecto
  • Conversión sencilla con otros tipos de índice

Conversión de tipos de Index

Index admite conversión entre varios tipos.

Convertir a otros tipos de índice

Ejemplo

import pandas as pd

# Crear un DataFrame de ejemplo
df = pd.DataFrame({"Valor": [1, 2, 3, 4]}, index=[10, 20, 30, 40])

# Convertir a tipo Index
print("Índice original:", df.index)
print("Tipo de índice:", type(df.index))

# Convertir a lista
idx_list = df.index.tolist()
print(f"Convertir a lista: {idx_list}")

# Convertir a array de NumPy
idx_array = df.index.values
print(f"Convertir a array: {idx_array}")

# Restablecer el índice a RangeIndex
df = df.reset_index(drop=True)
print(f"Restablecido a RangeIndex: {df.index}")

Establecer un índice personalizado

Puedes usar una columna del DataFrame para establecer el índice de filas.

Usar set_index

Ejemplo

import pandas as pd

# Crear DataFrame
df = pd.DataFrame({
    "ID de estudiante": ["S001", "S002", "S003", "S004"],
    "Nombre": ["Ana", "Luis", "Carlos", "Marta"],
    "Nota": [85, 92, 78, 90]
})

print("Datos originales:")
print(df)
print()

# Establecer la columna "ID de estudiante" como índice
df1 = df.set_index("ID de estudiante")
print("Establecer ID de estudiante como índice:")
print(df1)
print()

# Establecer múltiples índices (creará un MultiIndex)
df2 = df.set_index(["ID de estudiante", "Nombre"])
print("Establecer múltiples índices:")
print(df2)

Crear usando el parámetro index

Ejemplo

import pandas as pd

# Especificar el índice directamente al crear el DataFrame
df = pd.DataFrame(
    {"Nombre": ["Ana", "Luis", "Carlos"], "Edad": [25, 30, 28]},
    index=["A001", "A002", "A003"]
)

print(df)
print(f"\nÍndice: {df.index.tolist()}")

# Usar DatetimeIndex
dates = pd.date_range("2024-01-01", periods=3, freq="D")
df_date = pd.DataFrame({"Valor": [100, 200, 300]}, index=dates)

print("\n"Usando índice de fecha:")
print(df_date)
print(f"Tipo de índice: {type(df_date.index)}")

Operaciones de índice

Restablecer índice

Ejemplo

import pandas as pd

# Crear un DataFrame con índice personalizado
df = pd.DataFrame(
    {"Nombre": ["Ana", "Luis"], "Nota": [85, 92]},
    index=["A001", "A002"]
)

# Restablecer el índice al RangeIndex por defecto
df_reset = df.reset_index()
print("Restablecer índice:")
print(df_reset)

# Parámetro drop: si se descarta la columna de índice original
df_reset2 = df.reset_index(drop=True)
print("\nRestablecer y descartar el índice original:")
print(df_reset2)

Reindexar

Ejemplo

import pandas as pd

# Crear DataFrame
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}, index=[1, 2, 3])

# Reindexar (cambiar el orden del índice)
df_reindex = df.reindex([1, 2, 3, 4, 5])
print("Reindexar (rellenar valores faltantes con NaN):")
print(df_reindex)

# Usar fill_value para rellenar valores faltantes
df_reindex2 = df.reindex([1, 2, 3, 4, 5], fill_value=0)
print("\nReindexar (rellenar con 0):")
print(df_reindex2)

Operaciones de niveles de índice

Ejemplo

import pandas as pd

# Crear un DataFrame con índice multinivel
df = pd.DataFrame({
    "Lengua": [85, 92, 78],
    "Matemáticas": [90, 88, 95]
}, index=pd.MultiIndex.from_tuples(
    [("Primero de secundaria", "Clase A"), ("Primero de secundaria", "Clase B"), ("Segundo de secundaria", "Clase A")],
    names=["Grado", "Clase"]
))

print("DataFrame con índice multinivel:")
print(df)
print()

# Obtener el índice externo
print(f"Índice externo (grado): {df.index.get_level_values(0).tolist()}")
print(f"Índice interno (clase): {df.index.get_level_values(1).tolist()}")

Propiedades y métodos del índice

Propiedad/Método Descripción Ejemplo
index.tolist() Convertir a lista de Python df.index.tolist()
index.values Convertir a array de NumPy df.index.values
index.unique() Obtener valores únicos df.index.unique()
index.is_unique Verificar si el índice es único df.index.is_unique
index.astype() Convertir el tipo del índice df.index.astype(str)

Ejemplo de uso de propiedades del índice

Ejemplo

import pandas as pd

# Crear un DataFrame de ejemplo
df = pd.DataFrame(
    {"Valor": [1, 2, 3, 4]},
    index=["a", "b", "c", "d"]
)

# Ver las propiedades del índice
print(f"¿Es único el índice?: {df.index.is_unique}")
print(f"Longitud del índice: {len(df.index)}")
print(f"Tipo de datos del índice: {df.index.dtype}")

# Convertir a tipo cadena
str_index = df.index.astype(str)
print(f"Tipo después de la conversión: {str_index.dtype}")

Práctica: mejorar la eficiencia de consultas con índices

En el análisis de datos real, establecer adecuadamente el índice puede mejorar significativamente la eficiencia de las consultas.

Ejemplo

import pandas as pd

# Simular datos de negocio
df = pd.DataFrame({
    "ID de pedido": range(1000),
    "ID de cliente": [f"C{i%100:03d}" for i in range(1000)],
    "Producto": [f"Producto{i%20}" for i in range(1000)],
    "Importe": [round(i * 1.5, 2) for i in range(1000)]
})

# Establecer las columnas de consulta frecuente como índice
df_indexed = df.set_index(["ID de cliente", "Producto"])

# Consulta rápida usando índices (similar a la consulta por clave primaria en bases de datos)
result = df_indexed.loc[("C001", "Producto 1")]
print("Consultar los productos de un solo cliente usando el índice:")
print(result)

# Estadísticas agrupadas por ID de cliente
print("\nTotal de gastos de cada cliente:")
customer_total = df.groupby("ID de cliente")["Monto"].sum()
print(customer_total.head(10))

Notas

1. Los valores del índice deben ser únicos

Si los valores del índice no son únicos, algunas operaciones (comolocbúsquedas) devolverán múltiples filas coincidentes.

2. El índice puede tener un nombre

Darle un nombre al índice puede mejorar la legibilidad del código:df.index.name = "学号"

3. El índice se mantiene con las operaciones de datos

Operaciones como el corte (slicing) y el filtrado conservan el índice; hay que prestar atención a la correspondencia entre el índice y los datos.

El índice es clave para el rendimiento de Pandas. Establecer las columnas de consulta frecuente como índice puede mejorar significativamente la velocidad de búsqueda, pero demasiados índices aumentan la sobrecarga de escritura, por lo que se debe usar con equilibrio.

Otras extensiones