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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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.
Otras extensionesEl í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.