возвратный ряд, если расстояние между данной точкой и каждой (df.lat, df.lng) меньше или равно 0,1 км - PullRequest
1 голос
/ 20 сентября 2019

Мой импорт https://pypi.org/project/haversine/

from haversine import haversine, Unit

У меня есть этот геокод = (37.504855525623, 127.04866656867)
мой фрейм данных выглядит примерно так:

  title created_at              lng                 lat
0   a   2019-01-16 21:21:11    127.04866656867   37.504855525623
1   b   2019-02-15 20:54:59    126.93494467808   37.558505360332
2   c   2019-02-22 17:57:02    126.8891543       37.5817986
3   d   2019-02-26 21:58:27       0                   0   
4   e   2019-02-26 21:58:55    127.06710898411   37.54394538898

Для каждой строки, которую я хочуего (lat, lng) пару и сравните ее с геокодом, приведенным выше в первом предложении.

Я пробовал df.loc[haversine((df.lat,df.lng), geocode) <= 0.1, False] = True Однако это дает мне

TypeError: cannot convert the series to <class 'float'>

, поэтому я изменил свои dtypes наfloat by:

df = df.astype({"lng": float, "lat":float})

и когда я проверяю, используя df.dtypes, он правильно указывает lat, lng как float 64. и все равно выдает мне ту же ошибку.

haversine - это функция в пакете haversineРЕДАКТИРОВАТЬ: haversine нужны две пары геокодирования.например: haversine ((lat1, lng1), (lat2, lng2))

аналогичные сообщения, но не могут быть реализованы на моем: TypeError: невозможно преобразовать серию в
Ошибка ввода: невозможно преобразовать серию в

Ответы [ 2 ]

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

Вы можете использовать apply в двух столбцах и фильтровать результат:

filtered = df[(df[['lat','lng']].apply(lambda x: haversine(*x,*geocode), axis=1))<=0.1]

print (filtered)

Результат:

          title created_at         lng        lat
0 a  2019-01-16   21:21:11  127.048667  37.504856
1 голос
/ 20 сентября 2019

ваша функция haversine принимает значения с плавающей точкой, но вы отправляете ей серию панд

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

, если вы используете numba.vectorize, тогда это будет более эффективно, так как numba скомпилирует функцию python

v_haversine = pd.np.vectorize(lambda x,y: haversine(x,y, geocode))

df.loc[haversine(df.lat,df.lng) <= 0.1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...