выполнить функцию haversine для четырех столбцов в новые столбцы - PullRequest
0 голосов
/ 30 сентября 2019
    ID        st_lat    st_lng        end_lat   end_lng
0   4       127.035740  37.493954   127.035740  37.493954
1   4       127.035740  37.493954   127.035740  37.493954
2   5       127.034870  37.485865   127.034318  37.485645
3   5       127.034201  37.485598   127.035064  37.485949
4   5       127.035064  37.485949   127.034618  37.485938

мой фрейм данных выглядит как выше. Я пытаюсь создать новый столбец, применяя функцию haversine, которая требует двух кортежей. например: haversine ((lat, lng), (lat, lng)) возвращает расстояние между двумя точками.

Их типы данных находятся в float. следующий https://www.geeksforgeeks.org/create-a-new-column-in-pandas-dataframe-based-on-the-existing-columns/ Я сделал

df["distance(km)"] = df.apply(lambda row:haversine((row.st_lat, row.st_lng), (row.end_lat, row.end_lng))) 

, который возвращает

AttributeError: ("Объект" Series "не имеет атрибута" st_lat "", "произошел в индексе user_id ')

и

df["distance(km)"] = haversine((df.st_lat, df.st_lng), (df.end_lat, df.end_lng))

возвращая TypeError: невозможно преобразовать серию в число с плавающей точкой.

Я знаю, что это потому, что df.st_lat дает серии и не может ввести две серии и создать кортеж.

для каждой пары st_lat, st_lng Я хочу сравнить ее с парой end_lat, end_lng и создать столбец, содержащий расстояния.

Любая помощь? Я смотрел на , как разбить столбец кортежей в пандах? - 1023 *

Разделить столбец, содержащий 2 значения, на разные столбцы в пандах df

что противоположно тому, что я пытаюсь сделать.

РЕДАКТИРОВАТЬ: решается с помощью

   def dist(df):
    return haversine(df["start"], df["end"])

   df["distance(km)"] = df.apply(dist, axis =1)

1 Ответ

2 голосов
/ 30 сентября 2019

Вы можете использовать векторную версию функции haversine. link

df["distance(km)"] = haversine_np(df.st_lat, df.st_lng, df.end_lat, df.end_lng)


df

   ID      st_lat     st_lng     end_lat    end_lng  distance(km)
0   4  127.035740  37.493954  127.035740  37.493954  0.000000
1   4  127.035740  37.493954  127.035740  37.493954  0.000000
2   5  127.034870  37.485865  127.034318  37.485645  0.063084
3   5  127.034201  37.485598  127.035064  37.485949  0.098737
4   5  127.035064  37.485949  127.034618  37.485938  0.049567
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...