在 Pandas 中应用一个使用多行多列的函数

问题描述

我有一个可以在 here 中找到的 df。

我正在尝试针对“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 (将#修改为@)