[英]Error in Python's Math library for Haversine function
我试图找到两个地理拉特和多头之间的距离
我已经创建了一个具有必要公式的函数hasrsine:
from math import radians,cos,sin,asin,sqrt
def haversine(lon1,lat1,lon2,lat2):
#convert decimals to radians
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 * asin(sqrt(a))
r = 6371 # Radius of earth in kilometers. Use 3956 for miles
return c * r
haversine(-97.481,-97.622,-74.1083,-74.106)
现在我想找到我的df中的点的距离,如果它们在纬度和长度的泽西城市半径50公里范围内:
import pandas as pd
df = pd.DataFrame({'Company':['WM','WS','WC','WW'],
'city':['Norman','OKC','NY','Bayonne'],
'latitude':[35.221,35.463,41.112,40.66],
'longtitude':[-97.481,-97.622,-74.1083,-74.106]})
jersey_city_lat_lon=(40.94,-74.05)
df['distance']=df.apply(haversine,args=(jersey_city_lat_lon),axis=1)
df[df['distance']<=100]
但是,当我运行上面的操作时,我收到一个错误:
Traceback (most recent call last):
File "<ipython-input-123-8d33df9e0fab>", line 7, in <module>
df['distance']=df.apply(haversine,args=(jersey_city_lat_lon),axis=1)
File "C:\Users\j\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\frame.py", line 6487, in apply
return op.get_result()
File "C:\Users\j\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\apply.py", line 151, in get_result
return self.apply_standard()
File "C:\Users\j\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\apply.py", line 257, in apply_standard
self.apply_series_generator()
File "C:\Users\j\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\apply.py", line 286, in apply_series_generator
results[i] = self.f(v)
File "C:\Users\j\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\apply.py", line 78, in f
return func(x, *args, **kwds)
TypeError: ("haversine() missing 1 required positional argument: 'lat2'", 'occurred at index 0')
它应该工作,并告诉我一个位置在纽约,另一个位于巴约讷,这是我们正在寻找的半径范围内,因为纽约和巴约讷都在距离泽西市50公里的径向距离内。 为什么我会收到此错误?
df.apply将行对象(或轴= 0的列)传递给目标函数。 它不知道将行解压缩到您想要的字段。 您可以将hasrsign函数包装为仅提取lat和lon列
jersey_city_long_lat=(-74.05,40.94)
def row_hsign(row):
return haversine(*jersey_city_long_lat,row['longtitude'],row['latitude'])
df['distance']=df.apply(row_hsign,axis=1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.