Ускорьте работу pandas iterrows (от xy до lat длинной координаты pyproj)

Я использовал iterrows для преобразования координат XY в Lat, Long с помощью модуля pyProj. Я знаю, что использовать iterrows в пандах медленно, но у меня возникают проблемы с поиском другого способа кодирования этого.

У меня есть данные с именами скважин и координатами X и Y каждой скважины. У меня также есть столбец с системой координат ESPG, который может быть прочитан pyProj. Эта система координат EPSG отличается для многих различных скважин. Я предоставил пример dataframe.

data = pd.DataFrame({"WellName": ("well1","well2","well3","well4","well5"),"EPSG": ('epsg:21898','epsg:21898','epsg:21897','epsg:21897','epsg:21897'),'X':(900011,900011,900011,900011,900011),'Y':(800011,800011,800011,800011,800011)})
data

Я перебираю каждую строку этого фрейма данных, нахожу систему координат epsg, затем преобразую x,y в lat, long. Это работает, но очень медленно. Есть ли более простое и элегантное решение, которое может ускорить его?

import pandas as pd
import numpy as np
from pyproj import Proj, transform


for index, row in data.iterrows():
        # epsg coord system (from EPSG row)
        inProj = Proj(init=row['EPSG'])
        # espg coord system for lat long
        outProj = Proj(init='epsg:4326')
        # X and Y coords (from X and Y rows)
        x1,y1 = row['X'],row['Y']#output
        x2,y2 = transform(inProj,outProj,x1,y1)
        #print (x2,y2)
        # create and fill in lat and long columns
        data.loc[index,'latitude'] = x2
        data.loc[index,'longitude'] = y2
        #print (row['name'],row['X'],(row['EPSG']))

Я пытался это векторизовать, но я понятия не имею, что я делаю, и это разбивает мой питон. Я бы не предложил использовать его...:/

data['latitude'],data['longitude'] = transform(Proj(init=(data['EPSG'])), Proj(init='epsg:4326'), data['X'], data['Y'])

Половина пути решения:

После дополнительных попыток я частично решил свой вопрос. Теперь на несколько порядков быстрее, используя "применить"

Он создает новый столбец кортежа с широтой, длиной. Затем я должен выполнить некоторый обход решения, чтобы создать два отдельных столбца (один для лат, один для длинных) для кортежа.

    data['LatLong'] = data.apply(lambda row:  transform(Proj(init=row['EPSG']),Proj(init='epsg:4326'),row['X'],row['Y']), axis=1)

LatLongIndex = pd.DataFrame(data['LatLong'].values.tolist(), index=data.index)
dfDevLatLong = pd.merge(dataSDX,LatLongIndex, right_index=True, left_index=True)
dfDevLatLong

Теперь это выполнимо, но все еще немного медленно, и я уверен, что есть более элегантный способ сделать это.

1 ответ

Я частично решил мой вопрос. Теперь на несколько порядков быстрее, используя "применить"

Он создает новый столбец кортежа с широтой, длиной. Затем я должен выполнить некоторый обход решения, чтобы создать два отдельных столбца (один для лат, один для длинных) для кортежа.

    data['LatLong'] = data.apply(lambda row:  transform(Proj(init=row['EPSG']),Proj(init='epsg:4326'),row['X'],row['Y']), axis=1)

LatLongIndex = pd.DataFrame(data['LatLong'].values.tolist(), index=data.index)
dfDevLatLong = pd.merge(dataSDX,LatLongIndex, right_index=True, left_index=True)
dfDevLatLong

Теперь это выполнимо, но все еще немного медленно, и я уверен, что есть более элегантный способ сделать это.

Другие вопросы по тегам