根据DataFrame经纬度坐标查找最近位置并获取对应名称
解决方法
核心逻辑是用哈弗辛(Haversine)公式计算地球球面经纬度距离,再为df1的每个点位匹配df2中距离最近的点位名称。注意你给出的df2定义中Name列表的元素缺少字符串引号,我会先修正避免运行报错。
完整实现代码
import pandas as pd import numpy as np # 哈弗辛公式:输入两点经纬度,返回两点距离(单位:公里) def haversine(lat1, lon1, lat2, lon2): # 角度转弧度 lat1, lon1, lat2, lon2 = map(np.radians, [lat1, lon1, lat2, lon2]) dlat = lat2 - lat1 dlon = lon2 - lon1 # 公式计算逻辑 a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2)**2 c = 2 * np.arcsin(np.sqrt(a)) return c * 6371 # 6371为地球平均半径,单位公里 # 初始化两个DataFrame dloc1 = {'lat': [41.75, 41.87,41.77], 'long': [-87.62, -87.74,-87.69]} df1 = pd.DataFrame(data=dloc1) dloc2 = {'Name': ['a','c','b'], 'lat': [41.830, 41.90,41.97], 'long': [-87.62, -87.69,-88.65]} df2 = pd.DataFrame(data=dloc2) # 为df1每行匹配最近点位的Name df1['nearest_name'] = df1.apply( lambda row: df2.iloc[haversine(row['lat'], row['long'], df2['lat'], df2['long']).argmin()]['Name'], axis=1 )
运行结果
打印df1即可看到新增的匹配结果列:
| 序号 | lat | long | nearest_name |
|---|---|---|---|
| 0 | 41.75 | -87.62 | a |
| 1 | 41.87 | -87.74 | c |
| 2 | 41.77 | -87.69 | a |
如果你的数据量超过10万条,可以改用scipy.spatial.distance.cdist做向量化计算提升效率,小数据量上述方法足够使用。
内容的提问来源于stack exchange,提问作者Rtypuss
相关产品推荐
相关产品推荐

