我有两个不同大小的数据帧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的所有案例,并计算和列出两者之间的距离,以便更容易在县之间进行平均。你知道吗
也许我走错了路。任何建议都非常感谢。谢谢。你知道吗
我想你应该先加入两个数据帧。这将为您提供一个数据帧,其中的行
CountyClinicFIPS
=CountyRetailerFIPS
。代码如下所示:然后使用haversine的向量化实现,如下面的答案中所示-Fast Haversine Approximation (Python/Pandas)。这将比逐行遍历dataframe和使用apply函数更快。你知道吗
haversine代码看起来是这样的(一旦您从上面的链接导入了
haversine_np
函数):希望这有帮助!你知道吗
相关问题 更多 >
编程相关推荐