Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

340
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda