En este artículo, aprenderemos sobre mapeo y las funciones apply y applymap.
Esta técnica te ayudará a manipular tus datos de formas muy convenientes, y es otra adición importante a tu caja de herramientas.
Como siempre, exploraremos el tema con ejemplos que te ayudarán a entender qué está pasando.
¡Perfecto, comencemos!
Mapeo
Mapeo significa aplicar una función que transforma los elementos de un dominio en los elementos de otro dominio. En este caso, las entradas, filas y columnas en una serie o dataframe. Pandas te permite aplicar funciones a nivel de elemento, fila y columna para crear nuevas series y dataframes.
Pandas también es compatible con muchas de las operaciones definidas en NumPy. Esto te permite aplicar funciones de una manera muy conveniente y eficiente. Veamos algunos ejemplos:
import numpy as np
import pandas as pd
frame = pd.DataFrame(np.random.randn(4,5),
columns=list('abcde'),
index=['one', 'two', 'three', 'four'])
frame
a | b | c | d | e | |
---|---|---|---|---|---|
one | 3.007277 | 0.388730 | 0.113406 | 2.119481 | -0.975847 |
two | 0.636278 | 0.206911 | 1.778134 | -1.663180 | -1.211043 |
three | 0.946199 | -0.397836 | -0.127306 | -0.588036 | 1.026060 |
four | -0.315198 | -0.496803 | -0.918301 | 0.389656 | -1.515556 |
# Puedes aplicar funciones de NumPy directamente en dataframes.
# Puedes, por ejemplo, calcular el valor absoluto de cada entrada
np.abs(frame)
a | b | c | d | e | |
---|---|---|---|---|---|
one | 3.007277 | 0.388730 | 0.113406 | 2.119481 | 0.975847 |
two | 0.636278 | 0.206911 | 1.778134 | 1.663180 | 1.211043 |
three | 0.946199 | 0.397836 | 0.127306 | 0.588036 | 1.026060 |
four | 0.315198 | 0.496803 | 0.918301 | 0.389656 | 1.515556 |
# También puedes calcular la 3ra potencia de cada entrada
np.power(frame, 3)
a | b | c | d | e | |
---|---|---|---|---|---|
one | 27.196948 | 0.058741 | 0.001459 | 9.521129 | -0.929277 |
two | 0.257597 | 0.008858 | 5.622036 | -4.600633 | -1.776145 |
three | 0.847125 | -0.062967 | -0.002063 | -0.203335 | 1.080236 |
four | -0.031315 | -0.122617 | -0.774382 | 0.059162 | -3.481093 |
Puedes aplicar muchas de las ufuncs de NumPy a las estructuras de datos de Pandas, en la mayoría de situaciones proporcionan un resultado con las mismas dimensiones de la estructura original.
Otra operación importante (y bastante común) crea una nueva estructura después de aplicar una operación a cada fila o columna en el dataframe original. Veamos cómo crear una nueva estructura cuyas entradas son el resultado de sumar cada columna/fila de nuestro frame:
# El apply de Pandas ejecuta una función a lo largo de un eje.
# El comportamiento por defecto es ejecutarlo usando el eje de filas (aplicar la operación en cada columna)
# Produzcamos una Serie donde cada entrada es la suma de los valores en cada columna:
ser = frame.apply(np.sum)
ser
a 4.274556
b -0.298998
c 0.845934
d 0.257921
e -2.676385
dtype: float64
# Si quieres realizar la operación usando columnas como eje (la operación se aplicará por fila)
# Puedes pasar el argumento opcional axis
ser = frame.apply(np.sum, axis='columns')
ser
one 4.653047
two -0.252900
three 0.859082
four -2.856201
dtype: float64
De nuevo, puedes usar la mayoría de las ufuncs de NumPy como argumento para la función apply, pero no termina ahí: Puedes definir tus propias funciones y usarlas con applymap. El siguiente ejemplo aplica una función que suma 2 a cada entrada:
def sum_two(entry):
return entry + 2
frame.applymap(sum_two)
a | b | c | d | e | |
---|---|---|---|---|---|
one | 5.007277 | 2.388730 | 2.113406 | 4.119481 | 1.024153 |
two | 2.636278 | 2.206911 | 3.778134 | 0.336820 | 0.788957 |
three | 2.946199 | 1.602164 | 1.872694 | 1.411964 | 3.026060 |
four | 1.684802 | 1.503197 | 1.081699 | 2.389656 | 0.484444 |
# Puedes hacer esto usando lambdas, usualmente es más fácil de leer:
sum_three = lambda x: x+3
frame.apply(sum_three)
a | b | c | d | e | |
---|---|---|---|---|---|
one | 6.007277 | 3.388730 | 3.113406 | 5.119481 | 2.024153 |
two | 3.636278 | 3.206911 | 4.778134 | 1.336820 | 1.788957 |
three | 3.946199 | 2.602164 | 2.872694 | 2.411964 | 4.026060 |
four | 2.684802 | 2.503197 | 2.081699 | 3.389656 | 1.484444 |
Concepto simple, aplicaciones infinitas
Realizar mapeos te permite hacer casi cualquier cosa que necesites con tus datos. Cualquier cosa, desde agregaciones estadísticas hasta herramientas avanzadas de aprendizaje automático se construyen sobre esta base.
Como habrás notado, el concepto es muy simple, pero saber cómo aplicar funciones de NumPy a estructuras de datos de Pandas te ayudará en el día a día. ¡Esto es aún más obvio cuando empiezas a explorar el potencial de aplicar tus propias funciones!
En el próximo artículo, aprenderemos sobre resumir datos y estadísticas descriptivas.
¡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)