es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

acelerar bucles anidados utilizando dos marcos de datos en código Python

ServicePop tiene una coordenada (x, y) y quiero agregar un número cuadrado (gid).
Hice un bucle anidado para asignar un número cuadrado, pero ServicePop es tan grande que tarda varias horas.
¿Hay alguna manera más rápida y eficiente de hacerlo?
Cuando busqué en Google, dijeron que usar apply en un dataframe o vectorizar ayudaría, pero no pude modificar mi código para usar tal mejora.
Necesito tu ayuda, por favor.

import pandas
import datetime
TotPopCenter = pandas.read_csv(‘TotalPopulationCurrentCenterShapeCoordinate_UTF8.csv’, encoding=’euckr’)
ServicePop = pandas.read_csv(‘202101_Final.csv’, encoding=’euckr’)
ServicePop.insert(9, ‘gid’, ”)
Service_gid = [” for _ in range(len(ServicePop))]
for j in range(len(ServicePop)):
for i in range(len(TotPopCenter)):
if (ServicePop[‘X_COORD’][j] >= TotPopCenter[‘xcoord’][i] – 125) and \
(ServicePop[‘X_COORD’][j] < TotPopCenter[‘xcoord’][i] + 125) and \
(ServicePop[‘Y_COORD’][j] >= TotPopCenter[‘ycoord’][i] – 125) and \
(ServicePop[‘Y_COORD’][j] < TotPopCenter[‘ycoord’][i] + 125):
Service_gid[j] = TotPopCenter[‘gid’][i]
ServicePop[‘gid’] = Service_gid

TotPopCenter
gid lbl val xcoord ycoord
0 LM87ab60ba NaN NaN 1087375 1760625
ServicePop
STDYMD XCOORD YCOORD HCODE WKDYCD TIME HPOP WPOP VPOP
0 2021-01-01 1.087484e+06 1.760579e+06 2207061 FRI 0 27.97 0.82 7.24

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma más eficiente de agregar un número cuadrado (gid) a ServicePop basado en los datos de coordenadas x, y. En lugar de utilizar bucles for anidados, puedes utilizar la vectorización con el método apply de pandas.

    Aquí tienes un ejemplo de código:

    import pandas as pd
    
    # leer los datos
    tot_pop_center = pd.read_csv('TotalPopulationCurrentCenterShapeCoordinate_UTF8.csv', encoding='euckr')
    service_pop = pd.read_csv('202101_Final.csv', encoding='euckr')
    
    # definir una función para calcular gid basado en las coordenadas x, y
    def calcular_gid(fila):
        # filtrar tot_pop_center basado en las coordenadas x, y
        filtrado = tot_pop_center[(fila['X_COORD']-125 <= tot_pop_center['xcoord']) &
                                  (fila['X_COORD']+125 >= tot_pop_center['xcoord']) &
                                  (fila['Y_COORD']-125 <= tot_pop_center['ycoord']) &
                                  (fila['Y_COORD']+125 >= tot_pop_center['ycoord'])]
        # devolver el gid de la primera fila, o '' si no hay filas
        return filtrado['gid'].iloc[0] if len(filtrado) > 0 else ''
    
    # aplicar la función a cada fila de service_pop para calcular el gid
    service_pop['gid'] = service_pop.apply(calcular_gid, axis=1)
    

    En este código, definimos una función calcular_gid que toma como entrada una fila de service_pop y devuelve el correspondiente gid basado en las coordenadas x, y. La función filtra tot_pop_center basado en las mismas coordenadas x, y, y devuelve el gid de la primera fila, o ” si no hay filas. Luego, utilizamos el método apply en service_pop a lo largo del eje 1 para aplicar la función a cada fila y calcular el gid correspondiente.

    Esto debería ser mucho más rápido y eficiente que utilizar bucles for anidados. ¡Avísame si tienes alguna pregunta!

Comments are closed.