Python 使用Pandas数据帧的Haversine函数

Python 使用Pandas数据帧的Haversine函数,python,pandas,dataframe,haversine,Python,Pandas,Dataframe,Haversine,我是Python新手。我试图在熊猫数据帧上计算哈弗森。我有两个数据帧。像这样: 第二个: 这是我的哈弗森函数 from math import radians, cos, sin, asin, sqrt def haversine(lon1, lat1, lon2, lat2): # convert decimal degrees to radians lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1,

我是Python新手。我试图在熊猫数据帧上计算哈弗森。我有两个数据帧。像这样:

第二个:

这是我的哈弗森函数

    from math import radians, cos, sin, asin, sqrt

    def haversine(lon1, lat1, lon2, lat2):
      # convert decimal degrees to radians 
      lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

      # haversine formula 
      dlon = lon2 - lon1 
      dlat = lat2 - lat1 
      a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
      c = 2 * asin(sqrt(a)) 
      r = 3956 # Radius of earth in kilometers.
      return c * r
我以第一个数据帧中的经度和纬度值为中心,在地图上画圆圈(半径为1000米)。首先,我尝试将第二个数据帧中的所有lon和lat值赋给haversine函数,其中lon和lat值位于第一个数据帧的第一行。然后,我将对第一个数据帧中的其他行执行相同的操作。因此,我将能够找出第二个数据帧中的坐标(经度和纬度值)是否位于第一个数据帧中具有中心经度和纬度值的圆圈中。当我这样使用时,它会起作用:

a = haversine(29.023165,40.992752,28.844604,41.113586)
radius = 1.00 # in kilometer
if a <= radius:
    print('Inside the area')
else:
    print('Outside the area')

你能帮我怎么做吗?提前感谢。

用于计算haversine距离的代码在每个参数中接收一个浮点数,因此确实需要为每个参数传递浮点数。在这种情况下,
iskeller['lon']
iskeller['lat']
是串联的

这将用于计算同一行中坐标之间的距离:

iskeleler.loc['density'] = iskeleler.apply(lambda row: haversine(
    row['lon'], row['lat'],
    row['LONGITUDE'], row['LATITUDE']
),axis=1)
但是您正在寻找一个成对的距离,这可能需要一个
for
循环,这是没有效率的。试一试

如果您喜欢表格结构,则:

distance_table = pd.DataFrame(
    distance_matrix,
    index=pd.MultiIndex.from_frames(iskeleler[['lat', 'lon']]),
    columns=pd.MultiIndex.from_frames(iskeleler[['LATITUDE', 'LONGITUDE']]),
).stack([0, 1]).reset_index(name='distance')

这是一个例子,有许多方法可以从矩阵创建数据帧。

这是否回答了您的问题@我试过了。但它给了我另一个错误。我更新并编写了我再次尝试的代码。非常感谢!现在我明白了。我在寻找成对的距离。但是,底层代码不起作用(表结构)。这没什么大不了的,我可以学习你提到的方法,然后再试一次。再次感谢。我能问一下哈弗森距离吗?将纬度和经度值输入haversine_距离函数是真的吗?或者我必须把这些纬度和经度值转换成半径,然后给出哈弗森距离的半径?我想得到以km为单位的值。我是这样做的。我把这里的距离矩阵乘以6371。(6371:以公里为单位的地球半径)。然后我想我可以找到小于1km的值。这是真的吗?输入值应以弧度为单位,将输出值乘以6371得到以公里为单位的结果
from sklearn.metrics.pairwise import haversine_distances

distance_matrix = haversine_distances(
    iskeleler[['lat', 'lon']],
    iskeleler[['LATITUDE', 'LONGITUDE']]
)
distance_table = pd.DataFrame(
    distance_matrix,
    index=pd.MultiIndex.from_frames(iskeleler[['lat', 'lon']]),
    columns=pd.MultiIndex.from_frames(iskeleler[['LATITUDE', 'LONGITUDE']]),
).stack([0, 1]).reset_index(name='distance')