map() y applymap() para operaciones elemento a elemento
Aplique una función a cada elemento de una Series con map() y a cada celda de un DataFrame con applymap().
map() y applymap() para operaciones elemento a elemento es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Pandas & NumPy Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.
Descripción general de Series.map()
Series.map() aplica una función, un diccionario u otra Series a cada elemento de una Series y devuelve una nueva Series. A diferencia de apply(), que puede recibir objetos complejos, map() siempre opera sobre valores escalares individuales. Es la herramienta estándar para codificar valores categóricos, buscar etiquetas en una tabla de correspondencias o aplicar una transformación sencilla elemento a elemento.
import pandas as pd
codes = pd.Series(['N', 'S', 'E', 'N', 'W'])
region_names = {'N': 'North', 'S': 'South', 'E': 'East', 'W': 'West'}
names = codes.map(region_names)
print(names)map() con una función
Pase una función, incluida una lambda, a map() cuando la transformación implique lógica en lugar de una tabla de correspondencias. La función recibe un escalar cada vez, por lo que no puede acceder a otras filas o columnas. Para asignar etiquetas mediante una condición sencilla, map() con una función es más claro que un bucle, pero más lento que np.where() en Series grandes.
prices = pd.Series([5.0, 25.0, 80.0, 150.0])
category = prices.map(lambda p: 'budget' if p < 20 else 'mid' if p < 100 else 'premium')
print(category)map() frente a replace()
Tanto map() como replace() pueden sustituir valores mediante un diccionario. La diferencia principal es que map() devuelve NaN para cualquier valor que no se encuentre en el diccionario, a menos que use fillna() después, mientras que replace() deja sin cambios los valores no coincidentes. Use replace() cuando solo quiera cambiar valores específicos y mantener todo lo demás tal como está.
s = pd.Series(['A', 'B', 'C', 'D'])
map_dict = {'A': 'Alpha', 'B': 'Beta'}
print('map():', s.map(map_dict).tolist()) # C,D → NaN
print('replace():', s.replace(map_dict).tolist()) # C,D → unchangedmap() con una Series (búsqueda de etiquetas)
Puede pasar otra Series a map() como tabla de correspondencias: los valores de la Series sobre la que se llama se utilizan como claves para buscar valores en el índice de la Series pasada como argumento. Esta es una forma concisa de unir una tabla de correspondencias sin una llamada completa a merge(); funciona como una búsqueda vectorizada en un diccionario cuya tabla de correspondencias está indexada por clave.
prices_lookup = pd.Series(
[10.0, 25.0, 50.0],
index=['SKU-001', 'SKU-002', 'SKU-003']
)
orders = pd.Series(['SKU-002', 'SKU-001', 'SKU-003', 'SKU-001'])
order_prices = orders.map(prices_lookup)
print(order_prices)DataFrame.applymap() para operaciones celda a celda
DataFrame.applymap(), llamado DataFrame.map() en Pandas 2.1 y versiones posteriores, aplica una función a cada celda individual de un DataFrame. A diferencia de apply(axis=0), que recibe una columna completa, applymap() recibe un escalar cada vez. Resulta útil para dar formato uniforme a todas las celdas, por ejemplo, redondear a 2 decimales todas las celdas numéricas o convertir a minúsculas todas las celdas de texto.
df = pd.DataFrame({
'a': [1.234, 5.678, 9.012],
'b': [3.456, 7.890, 2.345]
})
# Round every cell to 1 decimal place
df_rounded = df.applymap(lambda x: round(x, 1))
print(df_rounded)applymap() para dar formato a cadenas
Aplique un formato de cadena coherente a cada celda de un DataFrame con cadenas mixtas; por ejemplo, convierta todos los valores a formato de título o convierta None en una cadena vacía. applymap(str.strip) elimina los espacios en blanco de cada celda de todo el DataFrame con una sola llamada, lo que resulta mucho más conciso que iterar por las columnas y aplicar .str.strip() a cada una individualmente.
df_str = pd.DataFrame({
'name': [' Alice ', 'Bob ', ' Carol'],
'city': ['new york ', ' london', 'paris ']
})
df_clean = df_str.applymap(str.strip)
print(df_clean)applymap() para dar formato a divisas
Al preparar un DataFrame para mostrarlo en un informe, dé formato de divisa a las celdas numéricas mediante applymap(). Esto convierte los números en cadenas listas para mostrar sin modificar los tipos de datos subyacentes; la transformación solo se aplica a la salida final. Aplíquela como último paso antes de llamar a to_excel() o to_html() para exportar la tabla con formato.
revenue_table = pd.DataFrame({
'North': [12300.0, 9800.0],
'South': [7400.0, 11200.0]
}, index=['Q1', 'Q2'])
formatted = revenue_table.applymap(lambda x: f'${x:,.0f}')
print(formatted)Pandas 2.1: applymap cambia de nombre a map
En Pandas 2.1, DataFrame.applymap() cambió su nombre a DataFrame.map() para ser coherente con Series.map(). El antiguo applymap() sigue funcionando, pero muestra una advertencia de obsolescencia. En código de producción, compruebe su versión de Pandas y use df.map(func) si utiliza la versión 2.1 o posterior, para evitar advertencias de obsolescencia en futuras versiones.
import pandas as pd
print('Pandas version:', pd.__version__)
# Forward-compatible pattern:
if hasattr(pd.DataFrame, 'map'):
df_clean = df_str.map(str.strip) # Pandas 2.1+
else:
df_clean = df_str.applymap(str.strip) # Pandas < 2.1
print(df_clean)map() para codificar características categóricas
Los modelos de aprendizaje automático requieren entradas numéricas, por lo que las columnas categóricas deben codificarse. Use map() con un diccionario de codificación entera para convertir las categorías en números ordinales antes de pasar un DataFrame a un modelo. Para categorías nominales sin un orden natural, prefiera pd.get_dummies() o OneHotEncoder de scikit-learn.
size_order = {'small': 0, 'medium': 1, 'large': 2, 'enterprise': 3}
df['size_encoded'] = df['order_size'].map(size_order)
print(df[['order_size', 'size_encoded']])Encadenar map() para búsquedas en varios pasos
Encadene dos llamadas a map() cuando necesite una búsqueda en dos niveles: primero asigne un código a una clave intermedia y, después, asigne la clave intermedia a una etiqueta final. Por ejemplo, asigne el SKU del producto a un código de categoría y, después, el código de categoría al nombre de la categoría. Encadenar dos llamadas a map() es más claro que usar un diccionario anidado o realizar una combinación seguida de otra.
sku_to_cat_code = {'SKU-001': 'C1', 'SKU-002': 'C2', 'SKU-003': 'C1'}
cat_code_to_name = {'C1': 'Electronics', 'C2': 'Apparel'}
skus = pd.Series(['SKU-001', 'SKU-002', 'SKU-003'])
cat_names = skus.map(sku_to_cat_code).map(cat_code_to_name)
print(cat_names)Gestión elemento a elemento de valores nulos con map
Al usar map(func), la función se llama incluso para los valores NaN, lo que puede causar un TypeError si la función no gestiona None. Envuélvala con una comprobación de nulos mediante pd.isna(x) o use el parámetro na_action='ignore' en map() para omitir los valores NaN y dejarlos como NaN en la salida sin llamar a la función.
s = pd.Series([1.0, None, 3.0, None, 5.0])
# na_action='ignore' skips NaN values
result = s.map(lambda x: x * 2, na_action='ignore')
print(result)Comprobación rápida
Compruebe su comprensión de los conceptos de análisis de datos de esta lección.
Resumen de la lección
En esta lección ha aprendido: usar Series.map() para realizar búsquedas escalares con funciones y diccionarios, usar DataFrame.applymap()/map() para dar formato celda a celda en todas las columnas y comprender la diferencia entre map() y replace() al gestionar valores no coincidentes. A continuación, exploraremos el encadenamiento de métodos con pipe() para crear canalizaciones de transformación legibles.
Preguntas frecuentes
¿La lección «map() y applymap() para operaciones elemento a elemento» es gratis?
Sí — el texto completo de «map() y applymap() para operaciones elemento a elemento» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Pandas & NumPy Academy, actualiza a CoddyKit PRO. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.
¿Qué aprenderé en «map() y applymap() para operaciones elemento a elemento»?
Aplique una función a cada elemento de una Series con map() y a cada celda de un DataFrame con applymap(). Practicas Pandas & NumPy Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Pandas & NumPy Academy?
No se requiere experiencia previa. Pandas & NumPy Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «map() y applymap() para operaciones elemento a elemento»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Pandas & NumPy Academy?
Sí. Cada lección de Pandas & NumPy Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- apply() en columnas y filas
- apply() con GroupBy
- map() y applymap() para operaciones elemento a elemento
- Encadenamiento de métodos con pipe()