Pandas - Сравните 2 фрейма данных и найдите ближайшие значения - PullRequest
1 голос
/ 29 мая 2020

У меня есть 2 фрейма данных в Pandas, которые содержат longitude и latitude. Я пытаюсь пройти l oop через каждую из строк в первой и найти наиболее близкие совпадения longitude и latitude во втором фрейме данных.

У меня есть это в python, которое я найдено в другом сообщении SO ...

from math import cos, asin, sqrt

def distance(lat1, lon1, lat2, lon2):
    p = 0.017453292519943295
    a = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p)*cos(lat2*p) * (1-cos((lon2-lon1)*p)) / 2
    return 12742 * asin(sqrt(a))

def closest(data, v):
    return min(data, key=lambda p: distance(v['lat'],v['lon'],p['lat'],p['lon']))

tempDataList = [{'lat': 39.7612992, 'lon': -86.1519681}, 
                {'lat': 39.762241,  'lon': -86.158436 }, 
                {'lat': 39.7622292, 'lon': -86.1578917}]

v = {'lat': 39.7622290, 'lon': -86.1519750}
print(closest(tempDataList, v))

Я собираюсь попробовать изменить это для использования с моими pandas фреймами данных, но есть ли более эффективный способ сделать это, например, с PyProj ?

Есть ли у кого-нибудь пример или похожий код?

1 Ответ

0 голосов
/ 06 июля 2020

Думаю, вам будет проще сделать это, если вы воспользуетесь библиотекой ГИС. Итак, если вы используете geo pandas и shapely, вам будет удобнее. (Также используется pyproj.) Начните с кода ниже.

import pandas as pd
import geopandas as gpd
from shapely.ops import Point, nearest_points

tempDataList = [{'lat': 39.7612992, 'lon': -86.1519681}, 
                {'lat': 39.762241,  'lon': -86.158436 }, 
                {'lat': 39.7622292, 'lon': -86.1578917}]

df = pd.DataFrame(tempDataList)

#make point geometry for geopandas
geometry = [Point(xy) for xy in zip(df['lon'], df['lat'])]

#use a coordinate system that matches your coordinates. EPSG 4326 is WGS84
gdf = gpd.GeoDataFrame(df, crs = "EPSG:4326", geometry = geometry) 

#change point geometry
v = {'lat': 39.7622290, 'lon': -86.1519750}
tp = Point(v['lon'], v['lat'])

#now you can calculate the distance between v and others.
gdf.distance(tp)

#If you want to get nearest points
multipoints = gdf['geometry'].unary_union
queried_point, nearest_point = nearest_points(tp, multipoints)
print(nearest_point)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...