HOWTO · Pandas

Establecer columnas como índice en Pandas Dataframe

Este tutorial muestra cómo establecer columnas como índice en un DataFrame de Pandas con el método `set_index()` y con el parámetro `index_col` al leer un archivo.

En esta página

Un DataFrame de Pandas nuevo utiliza un índice entero predeterminado para identificar sus filas. Para usar etiquetas de fila más descriptivas, llama a set_index() en un DataFrame existente o pasa index_col a read_csv o read_excel al cargar el archivo. La primera opción resulta útil cuando los datos ya están en memoria; la segunda permite elegir las etiquetas durante la importación. Los ejemplos siguientes usan el mismo conjunto pequeño de datos de personas para que puedas comparar los resultados. Elige una columna cuyos valores permitan identificar fácilmente las filas durante el análisis; un índice puede contener valores repetidos, aunque una búsqueda por una etiqueta repetida puede devolver más de una fila.

Usar una columna de un DataFrame como índice con set_index()

set_index() es un método de DataFrame. De forma predeterminada, devuelve un DataFrame nuevo y quita la columna seleccionada de las columnas de datos. Asigna el resultado si quieres dejar intacto el DataFrame original. Pasa una lista de nombres de columnas para crear un MultiIndex, que identifica cada fila mediante una combinación de valores. Usa drop=False si también quieres conservar los valores seleccionados como columnas de datos normales.

Estas opciones afectan a la forma de acceder a los datos, no a si se descartan las filas. Por ejemplo, conserva una columna de nombres si el código posterior necesita usarla tanto como etiqueta como valor, o usa un MultiIndex de ciudad y edad si esa combinación tiene sentido para tu trabajo. Si quieres modificar el propio DataFrame existente, set_index(..., inplace=True) aplica el cambio y devuelve None; normalmente es más fácil de seguir asignar el DataFrame que se devuelve de forma predeterminada, lo que además permite conservar el original. Para volver a un índice normal, reset_index() coloca los valores del índice actual en columnas y, de forma predeterminada, asigna al resultado un índice entero nuevo. Esto resulta útil antes de exportar los datos o cuando las operaciones posteriores esperan que las etiquetas sean columnas normales.

El siguiente ejemplo crea el DataFrame de personas y luego genera índices a partir de una columna y de dos columnas. También muestra cómo conservar la columna de nombres y usarla como etiquetas de fila.

import pandas as pd

people = pd.DataFrame({
    "Name": ["Alice", "Bob", "Charlie"],
    "City": ["New York", "Los Angeles", "Chicago"],
    "Age": [25, 30, 35],
})

by_name = people.set_index("Name")
by_city_and_age = people.set_index(["City", "Age"])
with_name_column = people.set_index("Name", drop=False)

print(by_name)

Aquí, by_name usa los nombres como etiquetas de fila y conserva City y Age como columnas de datos. by_city_and_age usa ambas columnas seleccionadas como un MultiIndex, mientras que with_name_column usa los nombres como etiquetas y también conserva la columna Name. Las asignaciones crean DataFrames separados, por lo que people sigue disponible con sus columnas originales y su índice predeterminado. La instrucción de impresión muestra el resultado de una sola columna; puedes inspeccionar las otras dos variables de la misma manera. Para restaurar un índice entero normal y devolver los valores del índice a columnas, llama a by_name.reset_index(); esto devuelve otro DataFrame. Puedes asignar ese resultado si quieres seguir trabajando con la versión cuyo índice se ha restablecido.

Establecer el índice al leer un archivo CSV o Excel con index_col

Si los datos están en un archivo, elige el índice mientras los lees. Este ejemplo de CSV, que puedes ejecutar por sí solo, usa los mismos nombres de columnas y registros que el DataFrame anterior. StringIO permite que read_csv lea directamente el texto de muestra; si tienes un archivo CSV en disco, puedes adaptar la llamada y sustituirlo por una ruta como "people.csv":

from io import StringIO
import pandas as pd

csv_data = StringIO("""Name,City,Age
Alice,New York,25
Bob,Los Angeles,30
Charlie,Chicago,35
""")
people = pd.read_csv(csv_data, index_col="Name")

print(people)

El argumento index_col="Name" selecciona la columna por su encabezado, de modo que el índice resultante y las columnas de datos restantes coinciden con los de by_name en el primer ejemplo. Si index_col recibe un número, selecciona una columna por su posición, que empieza en cero; indicar el nombre del encabezado hace que la elección sea explícita y dependa menos del orden de las columnas. Para seleccionar varias columnas, pasa una lista como index_col=["City", "Age"] y crearás un MultiIndex durante la importación. Para un libro de Excel, usa la llamada equivalente pd.read_excel("people.xlsx", index_col="Name"). El libro debe estar disponible y pandas necesita tener instalado un motor de Excel adecuado para leer su formato. La llamada de Excel se muestra como patrón porque aquí no se proporciona ningún libro. Si hay un error tipográfico en un encabezado o cambia el orden de las columnas del archivo, comprueba sus nombres antes de elegir el índice para asegurarte de seleccionar el campo correcto.