Python

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 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.

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez
Tags: Pandas

Recent Posts

Síndrome del objeto brillante en ciencia de datos: el error simétrico a los costes hundidos

Hace poco publiqué una entrada en la que trataba de un sesgo bien documentado: aferrarse…

4 días ago

De la Regresión Logística al Scorecard: La Transformación Matemática

En un entrada previa explicamos qué son el WOE y el IV y por qué…

6 días ago

Analytics Lane lanza la versión 1.1 del laboratorio con nuevas suites de CLV y Scoring

Seguimos evolucionando el laboratorio de Analytics Lane y hoy lanzamos la versión 1.1, disponible en:…

7 días ago

Interés compuesto: la fuerza que multiplica tu dinero (y los errores que la anulan)

“El interés compuesto es la octava maravilla del mundo. El que lo entiende lo gana…

2 semanas ago

Cómo comparar datos con barras en Matplotlib: agrupadas, apiladas y porcentuales

Tienes los datos de ventas de tres productos en dos años distintos y quieres saber…

2 semanas ago

Costes hundidos en ciencia de datos: cuándo mantener un modelo y cuándo migrar

Imagina la situación. Tu equipo lleva tres años con un modelo en producción. No es…

3 semanas ago

This website uses cookies.