Pandas práctico(3): Reindexación y Eliminación

Hoy lidiaremos con dos técnicas que necesitamos cubrir antes de pasar a temas más avanzados de Pandas: Reindexación y eliminación de elementos.

Será un poco más corto que los primeros dos artículos de la serie, pero eso no significa que no sea importante. Ambas técnicas son muy útiles, y probablemente las usarás en tu trabajo del día a día si te conviertes en un practicante de Pandas.

¡Bien, comencemos!

Reindexación

Reindexación es una palabra elegante para crear un nuevo dataframe/serie con un índice alterado.

import pandas as pd

ser = pd.Series([2,1,3,4,7,6,5], index=['b', 'a', 'c', 'd', 'g', 'f', 'e'])
print(ser)
b    2
a    1
c    3
d    4
g    7
f    6
e    5
dtype: int64

La función reindex recibe una lista de elementos de índice y crea un nuevo dataframe (o serie) en el cual las filas/elementos siguen el orden especificado en esa lista.

Por ejemplo, podemos crear una nueva serie donde los números estén ordenados en orden ascendente proporcionando la siguiente entrada para reindex:

ordered_ser = ser.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
print(ordered_ser)
a    1
b    2
c    3
d    4
e    5
f    6
g    7
dtype: int64

No necesitas pasar todos los elementos en el índice original, puedes proporcionar una lista con solo los elementos que necesitas:

# Esto creará un nuevo dataframe con los últimos cuatro elementos, en orden descendente
ordered_ser = ser.reindex(['g', 'f', 'e', 'd'])
print(ordered_ser)
g    7
f    6
e    5
d    4
dtype: int64

A veces quieres reindexar la serie/dataframe para expandir el rango de elementos. En este caso, probablemente encuentres que algunos de los elementos están establecidos como NaN:

ser = pd.Series(['azul', 'rojo', 'verde'], index=[0,4,8])
ser.reindex(range(12))
0      azul
1       NaN
2       NaN
3       NaN
4      rojo
5       NaN
6       NaN
7       NaN
8     verde
9       NaN
10      NaN
11      NaN
dtype: object
# En este caso, puedes especificar un método de llenado para dictar qué pasará con las entradas vacías
# ffill, por ejemplo, realiza un llenado hacia adelante

ser.reindex(range(12), method='ffill')
0      azul
1      azul
2      azul
3      azul
4      rojo
5      rojo
6      rojo
7      rojo
8     verde
9     verde
10    verde
11    verde
dtype: object

Los frames se comportan de manera muy similar, pero también te permiten reindexar por columna. Echemos un vistazo a un ejemplo final de reindexación usando un dataframe:

import numpy as np

frame = pd.DataFrame(np.arange(16).reshape(4,4),
                     index = ['First', 'Second', 'Third', 'Fourth'],
                     columns = ['Alpha', 'Beta', 'Gamma', 'Delta'])

frame
Alpha Beta Gamma Delta
First 0 1 2 3
Second 4 5 6 7
Third 8 9 10 11
Fourth 12 13 14 15
# Podemos reindexar usando el índice de fila
frame.reindex(['Fourth', 'Second'])
Alpha Beta Gamma Delta
Fourth 12 13 14 15
Second 4 5 6 7
# O, reindexar usando las columnas
frame.reindex(columns=['Alpha', 'Gamma'])
Alpha Gamma
First 0 2
Second 4 6
Third 8 10
Fourth 12 14

Eliminando elementos

Ahora aprenderemos cómo remover elementos tanto de series como de dataframes. Esto usualmente se logra usando el método drop.

Nota que las llamadas a drop no alteran la serie/dataframe original. En su lugar, retornan uno nuevo sin los elementos especificados. Si por alguna razón necesitas alterar la serie/dataframe original, puedes pasar inplace=True como argumento.

ser = pd.Series([1,2,3,4], index=['a', 'b', 'c', 'd'])
print(ser)
a    1
b    2
c    3
d    4
dtype: int64
# Puedes pasar a drop el valor de índice del elemento que quieres eliminar
ser.drop('b')
a    1
c    3
d    4
dtype: int64
# También puedes pasar una lista de valores de índice
ser.drop(['a', 'c'])
b    2
d    4
dtype: int64

Los dataframes te permiten eliminar elementos usando tanto el índice de fila como el índice de columna.

frame
Alpha Beta Gamma Delta
First 0 1 2 3
Second 4 5 6 7
Third 8 9 10 11
Fourth 12 13 14 15
# Eliminemos las filas segunda y cuarta
frame.drop(['Second', 'Fourth'])
Alpha Beta Gamma Delta
First 0 1 2 3
Third 8 9 10 11
# Si añades un argumento adicional establecido como axis='columns' (o axis=1) eliminarás usando el índice de columna
# Deshagámonos de las columnas Alpha y Beta
frame.drop(['Alpha', 'Beta'], axis='columns')
Gamma Delta
First 2 3
Second 6 7
Third 10 11
Fourth 14 15

Fundamentos de manipulación de datos

Cuando explores datos, necesitarás alterar índices y eliminar filas con elementos que no necesitas. Como con todos los artículos anteriores, me gustaría animarte a practicar estas técnicas por tu cuenta hasta que te sientas cómodo con ellas.

En el próximo artículo, aprenderemos cómo realizar operaciones aritméticas con dataframes y series.

¡Gracias por leer!

Qué hacer después

Juan Luis Orozco Villalobos

¡Hola! Soy Juan, ingeniero de software y consultor en Budapest. Me especializo en computación en la nube e IA, y me encanta ayudar a otros a aprender sobre tecnología e ingeniería