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
- Comparte este artículo con amigos y colegas. Gracias por ayudarme a llegar a personas que podrían encontrar útil esta información.
- Puedes encontrar el código fuente para esta serie en este repositorio.
- Este artículo está basado en el libro: Python for Data Analysis.
- Envíame un email con preguntas, comentarios o sugerencias (está en la página Autor)