Цикл for Python для прохождения всех строк одного столбца - PullRequest
1 голос
/ 24 октября 2019

Я хочу извлечь все координаты из таблицы, которые находятся внутри заданного радиуса. Как мне установить цикл for?

Я использую для этого формулу haversine, и я просто ввожу значения lat и lon центральной точки и значения lat и lon тестируемой точки, если онанаходится в заданном радиусе.

Так что я подумал, что мне нужен цикл for, где я запускаю формулу haversine для каждой строки столбца lat и lon, и если координаты находятся внутри радиуса, я сохраняю их в списке.

#Get coordinates
#Center coordinates = nearest road location
lat1 = float(lowParkingUtilization.iloc[roadIndex].toLat)
lon1 = float(lowParkingUtilization.iloc[roadIndex].toLon)
#Test coordinates = scooter coordinates
insideRadius = []

radius = 2.50 # in kilometer

for i in eScooterVOI['lat']:
    lat2 = float(eScooterVOI['lat'][i])
    lon2 = float(eScooterVOI['lon'][i])
    a = haversine(lon1, lat1, lon2, lat2)

    if a <= radius:
        insideRadius += str(lon2)+","+str(lat2)
    else:

С данным кодом я получаю следующее сообщение об ошибке:

 File "<ipython-input-574-02dadebee55c>", line 18

    ^
SyntaxError: unexpected EOF while parsing

Ответы [ 3 ]

1 голос
/ 24 октября 2019

Правильный ответ на вопрос «Как мне установить цикл for?»это: ВЫ НЕ. pandas датафреймы не предназначены для зацикливания их строк. Что вам действительно нужно сделать, это создать два новых столбца в кадре данных, один для расчета расстояния и один для хранения имен в нужном формате:

eScooterVOI['dist'] = eScooterVOI.apply(lambda x: haversine(lon1, lat1, x['lon'], x['lat']), axis=1)
eScooterVOI['name'] = eScooterVOI['lon'].astype(str) + ',' + eScooterVOI['lat'].astype(str)

А затем, чтобы получить списоктолько с именами координат, расстояние которых меньше радиуса:

insideRadius = list(eScooterVOI[eScooterVOI['dist'] <= radius]['name'])

кстати: функция haversine может быть построена таким образом, что она получает серию pandas вместо значенияи тем самым он может быть реализован намного быстрее, чем с использованием df.apply, но для этого потребуется изменить некоторый код, которого здесь нет в этом вопросе.

0 голосов
/ 24 октября 2019

У вас была эта ошибка из-за вашего блока else. Когда Python читает его, он ожидает написания некоторого кода. Python не находит ничего, поэтому возникает ошибка.

Возможно, ваш код работает медленно, просто удалите блок else, вы можете использовать блок if, не ограничиваясь использованием else.

В любом случае, если выабсолютно хочу использовать else блок, попробуйте что-то вроде этого:

if a <= radius:
    insideRadius += str(lon2)+","+str(lat2)
else : 
    pass

Но я не думаю, что это рекомендуется.

0 голосов
/ 24 октября 2019

Сообщение об ошибке SyntaxError: unexpected EOF while parsing означает, что некоторые кодовые блоки не были завершены и достигнут конец кода.

Для вашего блока else требуется как минимум одна строка кода, которая должна быть в нем.

Например:

else:
    lots_of_code_to_write_here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...