如何找到大熊猫2个不同数据帧中2点之间的距离?

时间:2017-07-04 16:20:45

标签: python pandas numpy

我有两个数据帧,每个数据帧都有一组坐标。 Dataframe 1是生物量站点列表,坐标列为“lat”和“lng”列。 Dataframe 2是一个邮政编码坐标列表,链接到销售价格,坐标列为'pc_lat'和'pc_lng'。

我使用this stackoverflow question来计算每个属性最近的生物量站点。这是我正在使用的代码:

def dist(lat1, long1, lat2, long2):
return np.abs((lat1-lat2)+(long1-long2))

def find_site(lat, long):
    distances = biomass.apply(
        lambda row: dist(lat, long, row['lat'], row['lng']), 
        axis=1)
    return biomass.loc[distances.idxmin(),'Site Name']

hp1995['BiomassSite'] = hp1995.apply(
    lambda row: find_site(row['pc_lat'], row['pc_long']), 
    axis=1)

print(hp1995.head())

这很有效,因为我得到了最近的生物质生成站点的名称,但是我想知道这两个站点之间的距离。

  1. 我如何计算距离?

  2. 输出距离是多少?我想在生物质场地2公里范围内寻找物业。

1 个答案:

答案 0 :(得分:2)

要计算两个全球坐标之间的距离,您应该使用Haversine Formula,基于this页面,我已实施以下方法:

import math
def distanceBetweenCm(lat1, lon1, lat2, lon2):
    dLat = math.radians(lat2-lat1)
    dLon = math.radians(lon2-lon1)

    lat1 = math.radians(lat1)
    lat2 = math.radians(lat2)

    a = math.sin(dLat/2) * math.sin(dLat/2) + math.sin(dLon/2) * math.sin(dLon/2) * math.cos(lat1) * math.cos(lat2)
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
    return c * 6371 * 100000 #multiply by 100k to get distance in cm

您也可以通过乘以10的不同幂来修改它以返回不同的单位。在示例中,乘以100k会产生以厘米为单位的单位。如果没有乘法,则以km为单位返回距离。如果需要,您可以从那里执行更多的单位转换。

编辑:正如评论中所建议的,一个可能的优化是使用幂运算符而不是常规乘法,如下所示:

a = math.sin(dLat/2)**2 + math.sin(dLon/2)**2 * math.cos(lat1) * math.cos(lat2)

看一下this问题,阅读更多关于python中计算能力的速度复杂性的更多信息。