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
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:
En este código, definimos una función
calcular_gid
que toma como entrada una fila deservice_pop
y devuelve el correspondientegid
basado en las coordenadas x, y. La función filtratot_pop_center
basado en las mismas coordenadas x, y, y devuelve elgid
de la primera fila, o ” si no hay filas. Luego, utilizamos el métodoapply
enservice_pop
a lo largo del eje 1 para aplicar la función a cada fila y calcular elgid
correspondiente.Esto debería ser mucho más rápido y eficiente que utilizar bucles for anidados. ¡Avísame si tienes alguna pregunta!