如何通过两个不同大小的数据帧的循环来应用haversine函数?

2024-10-03 02:46:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个不同大小的数据帧A(236x4)和B(967x4)。我想用一个嵌套的循环遍历两个数据帧的行,该循环接受两个FIPS列的输入,如果它们相等,我想让它们吐出一个haversine距离。你知道吗

一个数据帧的头如下所示

       AddressClinic             CountyClinicFIPS       Lat               Lon\
 0  9137 ST.RT. 136, WEST UNION, OH, 45693   1.0   -83.60553     38.809795
 1  940 N. Cable Rd., Lima, OH, 45805        3.0   -84.14703     40.755620
 2  934 Center St. Ste E, Ashland, OH, 44805 5.0   -82.31091     40.859657  
 3  934 Center ST Ste. E, Ashland, OH, 44805 5.0   -82.31091     40.859657 
 4  3225 Lake Avenue, Ashtabula, OH, 44004   7.0   -80.79042     41.876133  

另一个数据帧是完全相同的格式,在同一格式中有不同的地址信息。你知道吗

                InputAddr            CountyRetailerFIPS Lat         Lon\
   0     16782 ST RT 125, WEST UNION, OH, 45693  1 -83.41653   38.771553
   1      156 NORTH MAIN ST, PEEBLES, OH, 45660  1 -83.40529   38.949960  
   2       18811 SR 136 , WINCHESTER, OH, 45697  1 -83.65418   38.937350 
   3  2100 HARDING HIGHWAY #12, LIMA, OH, 45804  3 -84.06680   40.730656  
   4         1102 ELIDA AVE, DELPHOS, OH, 45833  3 -84.32622   40.842110  

我一直在尝试的代码是这样的almagmation

import pandas as pd
import numpy as np
from numpy import cos, sin, arcsin, sqrt
from math import radians

dataclinic=pd.read_csv(r"C:\Users\Jack\Documents\Schoolwork\WICResearch\MyDocs\getdistanceclinic.csv")
dataretailer=pd.read_csv(r"C:\Users\Jack\Documents\Schoolwork\WICResearch\MyDocs\getdistanceretailer.csv")
datadistance = pd.DataFrame([])

def haversine(row):
    lon1 = row1['Lon']
    lat1 = row1['Lat']
    lon2 = row2['Lon']
    lat2 = row2['Lat']
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * arcsin(sqrt(a)) 
    km = 6367 * c
    return km

for index1, row1 in dataclinic.iterrows():
    for index2, row2 in dataretailer.iterrows():
        if row1['CountyClinicFIPS'] == row2['CountyRetailerFIPS']:
            datadistance = datadistance.apply(lambda row: haversine(row), axis=1)
        else: 
            continue


print(datadistance)

不出所料,它不起作用。它做了一些事,但不多。它返回datadistance作为一个series对象(0,)index1,2作为int 235966 row1,2作为一系列值(4,),这两个值都是数据帧第一行的元素。你知道吗

预期的结果是将datadistance填入ClinicFips=RetailerFips的所有案例,并计算和列出两者之间的距离,以便更容易在县之间进行平均。你知道吗

也许我走错了路。任何建议都非常感谢。谢谢。你知道吗


Tags: csv数据importpdohstlonrow1
1条回答
网友
1楼 · 发布于 2024-10-03 02:46:34

我想你应该先加入两个数据帧。这将为您提供一个数据帧,其中的行CountyClinicFIPS=CountyRetailerFIPS。代码如下所示:

df = pd.merge(dataclinic, dataretailter, left_on='CountyClinicFIPS', right_on='CountyRetailerFIPS', suffixes=['_clinic','_retailer'])

然后使用haversine的向量化实现,如下面的答案中所示-Fast Haversine Approximation (Python/Pandas)。这将比逐行遍历dataframe和使用apply函数更快。你知道吗

haversine代码看起来是这样的(一旦您从上面的链接导入了haversine_np函数):

df['distance'] = haversine_np(df['lon_clinic'],df['lat_clinic'],df['lon_retailer'],df['lat_retailer'])

希望这有帮助!你知道吗

相关问题 更多 >