问题描述
我正在尝试针对“lat_long”列之后的每一列计算“lat_long”特征的每一行之间的半正弦距离。总共有 45 行和 45 列需要处理。
这是我的公式:
from math import radians,cos,sin,asin,sqrt
def haversine(lat1,lon1,lat2,lon2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# convert decimal degrees to radians
lon1,lat1,lon2,lat2 = map(radians,[lon1,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 = 6371 # Radius of earth in kilometers. Use 3956 for miles
return c * r
当我使用 for 循环调用它时:
for i,j in zip(data['lat_long'],data.columns[8:]):
x,y = i.split(',')
a,b = j.split(',')
x = float(x)
y = float(y)
a = float(a)
b = float(b)
data[i] = data.apply(lambda coordinates: haversine(coordinates[x],coordinates[y],coordinates[a],coordinates[b]),axis=1)
这应该用这两个点之间的距离填充所有列中的所有值,但我收到以下错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-84-aa9c17327bac> in <module>
6 a = float(a)
7 b = float(b)
----> 8 data[i] = data.apply(lambda data: haversine(data[x],data[y],data[a],data[b]),axis=1)
9
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/frame.py in apply(self,func,axis,broadcast,raw,reduce,result_type,args,**kwds)
6904 kwds=kwds,6905 )
-> 6906 return op.get_result()
6907
6908 def applymap(self,func):
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/apply.py in get_result(self)
184 return self.apply_raw()
185
--> 186 return self.apply_standard()
187
188 def apply_empty_result(self):
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/apply.py in apply_standard(self)
290
291 # compute the result using the series generator
--> 292 self.apply_series_generator()
293
294 # wrap results
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/apply.py in apply_series_generator(self)
319 try:
320 for i,v in enumerate(series_gen):
--> 321 results[i] = self.f(v)
322 keys.append(v.name)
323 except Exception as e:
<ipython-input-84-aa9c17327bac> in <lambda>(data)
6 a = float(a)
7 b = float(b)
----> 8 data[i] = data.apply(lambda data: haversine(data[x],axis=1)
9
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/series.py in __getitem__(self,key)
1062 key = com.apply_if_callable(key,self)
1063 try:
-> 1064 result = self.index.get_value(self,key)
1065
1066 if not is_scalar(result):
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_value(self,series,key)
4719 k = com.values_from_object(key)
4720
-> 4721 k = self._convert_scalar_indexer(k,kind="getitem")
4722 try:
4723 return self._engine.get_value(s,k,tz=getattr(series.dtype,"tz",None))
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in _convert_scalar_indexer(self,key,kind)
3111 if kind in ["getitem","ix"] and is_float(key):
3112 if not self.is_floating():
-> 3113 return self._invalid_indexer("label",key)
3114
3115 elif kind in ["loc"] and is_float(key):
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in _invalid_indexer(self,form,key)
3331 "cannot do {form} indexing on {klass} with these "
3332 "indexers [{key}] of {kind}".format(
-> 3333 form=form,klass=type(self),key=key,kind=type(key)
3334 )
3335 )
TypeError: ("cannot do label indexing on <class 'pandas.core.indexes.base.Index'> with these indexers [13.721345] of <class 'float'>",'occurred at index 0')
出了什么问题?
感谢任何帮助。谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)