Revista Informática

Pandas: Convertir una columna en el índice

Publicado el 29 julio 2021 por Daniel Rodríguez @analyticslane
Pandas: Convertir una columna en el índice

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.


Volver a la Portada de Logo Paperblog