Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

338
Vistas
Reemplazo de pandas/lentitud del diccionario

Ayúdame a entender por qué esta operación de "reemplazar desde el diccionario" es lenta en Python/Pandas:

 # Series has 200 rows and 1 column # Dictionary has 11269 key-value pairs series.replace(dictionary, inplace=True)

Las búsquedas en el diccionario deben ser O(1). Reemplazar un valor en una columna debe ser O(1). ¿No es esta una operación vectorizada? Incluso si no está vectorizado, iterar 200 filas es solo 200 iteraciones, entonces, ¿cómo puede ser lento?

Aquí hay un SSCCE que demuestra el problema:

 import pandas as pd import random # Initialize dummy data dictionary = {} orig = [] for x in range(11270): dictionary[x] = 'Some string ' + str(x) for x in range(200): orig.append(random.randint(1, 11269)) series = pd.Series(orig) # The actual operation we care about print('Starting...') series.replace(dictionary, inplace=True) print('Done.')

Ejecutar ese comando lleva más de 1 segundo en mi máquina, que es miles de veces más de lo esperado para realizar <1000 operaciones.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Parece que replace tiene un poco de sobrecarga, y decirle explícitamente a Series qué hacer a través del map produce el mejor rendimiento:

 series = series.map(lambda x: dictionary.get(x,x))

Si está seguro de que todas las claves están en su diccionario, puede obtener un aumento de rendimiento muy leve si no crea una lambda y proporciona directamente la función dictionary.get . Cualquier clave que no esté presente devolverá NaN a través de este método, así que tenga cuidado:

 series = series.map(dictionary.get)

También puede proporcionar solo el diccionario en sí, pero esto parece introducir un poco de sobrecarga:

 series = series.map(dictionary)

Horarios

Algunas comparaciones de tiempo usando sus datos de ejemplo:

 %timeit series.map(dictionary.get) 10000 loops, best of 3: 124 µs per loop %timeit series.map(lambda x: dictionary.get(x,x)) 10000 loops, best of 3: 150 µs per loop %timeit series.map(dictionary) 100 loops, best of 3: 5.45 ms per loop %timeit series.replace(dictionary) 1 loop, best of 3: 1.23 s per loop
over 4 years ago · Santiago Trujillo Denunciar

0

.replace puede hacer coincidencias de subcadenas incompletas, mientras que .map requiere que se proporcionen valores completos en el diccionario (o devuelve NaN). La solución rápida pero genérica (que puede manejar subcadenas) primero debe usar .replace en un dictado de todos los valores posibles (obtenido, por ejemplo, con .value_counts().index ) y luego revisar todas las filas de la Serie con este dictado y .map . Este combo puede manejar, por ejemplo, reemplazos de caracteres nacionales especiales (subcadenas completas) en columnas de 1 m de fila en un cuarto de segundo, donde .replace solo tomaría 15.

over 4 years ago · Santiago Trujillo Denunciar

0

Gracias a @root: hice una evaluación comparativa nuevamente y encontré diferentes resultados en pandas v1.1.4

Encontrado series.map(dictionary) más rápido también devuelve NaN es clave no presente

Punto de referencia

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda