Los DataFrame de Pandas contienen una propiedad especial que son los índices, unos valores inmutables que se asignan a cada una de las filas del conjunto de datos. Al ser inmutables no es posible cambiar un valor específico, pero sí que es posible modificar todos los índices. En esta entrada vamos a ver cómo se pueden convertir una columna en el índice mediante el uso del método set_index()
.
El método set_index()
Los objetos DataFrame de Pandas cuentan con el método método set_index()
que tiene la siguiente forma
df.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
en donde las propiedades más importantes son:
-
keys
: los nombres de las columnas, pudiendo ser una o varias, que se establecerán como índice del DataFrame. -
drop
: indica si se eliminará la columna del conjunto de datos una vez establecida esta como índice, el valor por defecto es verdadero, por lo que las columnas se eliminarán. -
append
: valor que se indica si la columna se agrega al índice ya existente, por defecto el valor es falso, por lo que el índice actual será reemplazado por la nueva columna. -
inplace
: indica si el método aplica las modificaciones al propio objeto o devuelve una copia modificada del mismo, por defecto el valor es falso, por lo que se obtiene una copia modificada.
Convertir una columna en el índice del DataFrame
Al crear o importar un objeto DataFrame generalmente nos encontramos con la columna de índices que comienza en 0 aumentando una unidad para cada una de las filas. Salvo que se hubiese indicado explícitamente un valor diferente para esta columna.
import pandas as pd users = {'first_name': ['Montgomery', 'Dagmar', 'Reeba', 'Shalom', 'Broddy', 'Aurelia'], 'last_name': ['Humes', 'Elstow', 'Wattisham', 'Alen', 'Keningham', 'Brechin'], 'age': [27, 41, 29, 29, 21, 33], 'gender': ['Male', 'Female', 'Female', 'Male', 'Male', 'Female']} df = pd.DataFrame(users)
first_name last_name age gender 0 Montgomery Humes 27 Male 1 Dagmar Elstow 41 Female 2 Reeba Wattisham 29 Female 3 Shalom Alen 29 Male 4 Broddy Keningham 21 Male 5 Aurelia Brechin 33 Female
En el caso de que deseemos usar valor existente en el DataFrame como índice, por ejemplo un identificador, se puede usar el método set_index()
para convertir este. Así se puede usar el nombre de los usuarios para crear un nuevo DataFrame con este valor como índice.
dfi = df.set_index('first_name') dfi
last_name age gender first_name Montgomery Humes 27 Male Dagmar Elstow 41 Female Reeba Wattisham 29 Female Shalom Alen 29 Male Broddy Keningham 21 Male Aurelia Brechin 33 Female
Nótese que en el nuevo conjunto de datos se ha eliminado la columna original. En el caso de que esto no sea esto lo que se desee, es decir, si queremos conservar la columna en el objeto resultante, solamente se tiene que asignar el valor falso a la propiedad drop
.
dfi = df.set_index('first_name', drop=False)name') dfi
first_name last_name age gender first_name Montgomery Montgomery Humes 27 Male Dagmar Dagmar Elstow 41 Female Reeba Reeba Wattisham 29 Female Shalom Shalom Alen 29 Male Broddy Broddy Keningham 21 Male Aurelia Aurelia Brechin 33 Female
Convertir varias columnas en el índice del DataFrame
El método set_index()
también puede admitir la opción de varias columnas para crear el índice. Para conseguir esto en lugar de una cadena de texto con el nombre de la columna se tiene que pasar como parámetro una lista con el nombre de las columnas a usar. Así se puede crear un nuevo índice usando el nombre y los apellidos de los usuarios.
dfi = df.set_index(['first_name', 'last_name']) dfi
age gender first_name last_name Montgomery Humes 27 Male Dagmar Elstow 41 Female Reeba Wattisham 29 Female Shalom Alen 29 Male Broddy Keningham 21 Male Aurelia Brechin 33 Female
Observados que en este caso los índices pasan a ser una lista de tuplas.
dfi.index
MultiIndex([('Montgomery', 'Humes'), ( 'Dagmar', 'Elstow'), ( 'Reeba', 'Wattisham'), ( 'Shalom', 'Alen'), ( 'Broddy', 'Keningham'), ( 'Aurelia', 'Brechin')], names=['first_name', 'last_name'])
Otra forma de conseguir índices múltiples es agregando una nueva columna a los que ya existen. Lo que se puede conseguir asignando el valor verdadero a la propiedad append
.
dfi = df.set_index('first_name', append=True) dfi
last_name age gender first_name 0 Montgomery Humes 27 Male 1 Dagmar Elstow 41 Female 2 Reeba Wattisham 29 Female 3 Shalom Alen 29 Male 4 Broddy Keningham 21 Male 5 Aurelia Brechin 33 Female
Realizando las operaciones en memoria
Al trabajar con DataFrame pequeños, como los del ejemplo, no es un problema crear una copia con las modificaciones. Pero esto no es así cuando se trabaja con conjuntos de datos más grandes. Para evitar problemas de memoria en estos casos se puede asignar el valor verdadero a la propiedad inplace
, por lo que el objeto original se modificará y el método no devolverá ningún valor.
df.set_index('first_name', inplace=True) df
last_name age gender first_name Montgomery Humes 27 Male Dagmar Elstow 41 Female Reeba Wattisham 29 Female Shalom Alen 29 Male Broddy Keningham 21 Male Aurelia Brechin 33 Female
En este caso es importante tener cuidado con lo que se hace, ya que la operación no se podrá deshacer al modificarse el conjunto de datos original y no existir una copia en memoria.
Conclusiones
En esta entrada se ha visto cómo usar el método set_index()
para convertir una o varias columnas en el índice de un DataFrame. Permitiendo de esta manera modificar los valores de esta propiedad tan importante de los objetos de Pandas. La semana que viene veremos el proceso complementario a este: convertir los índices en una o varias columnas.