Pandas 在 geopy 距离中使用上一行的值
Pandas use the value from previous row in a geopy distance
我正在尝试根据前一行的坐标计算地理距离。有没有一种方法可以在不向数据框添加额外列的情况下进行计算?
示例代码:
import pandas
import geopy.distance
d = {'id_col':['A','B','C','D'],
'lat':[ 40.8397,40.7664,40.6845,40.6078],
'lon':[-104.9661,-104.999,-105.01,-105.003]
}
df = pandas.DataFrame(data=d)
第一种方法 lambda
和 apply
df['geo_dist']=df.apply(lambda x: geopy.distance.geodesic((x['lat'],x['lon']),(x['lat'].shift(),x['lon']).shift()),axis=1)
我会得到错误:AttributeError: ("'float' object has no attribute 'shift'", u'occurred at index 0')
我的第二种方法是在数据帧上调用函数:
def geodist(x):
return geopy.distance.geodesic((x['lat'],x['lon']),(x['lat'].shift(),x['lon']).shift())
df['geo_dist']=geodist(f)
在这种情况下我会得到错误:ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
非常感谢任何帮助。
第一种方法不会那样工作,因为 lambda 函数应用于 DataFrame 的单行并且 x 不是您期望的所有观察值的列表。为此,您可以使用 x.name-1 获取前一个元素索引并访问 df 中的位置,就像这样
df['geo_dist']=df.apply(lambda x: geopy.distance.geodesic((x['lat'],x['lon']),(df.iloc[x.name - 1].lat,df.iloc[x.name - 1].lon)) if x.name > 0 else 0,axis=1)
希望对您有所帮助
我正在尝试根据前一行的坐标计算地理距离。有没有一种方法可以在不向数据框添加额外列的情况下进行计算?
示例代码:
import pandas
import geopy.distance
d = {'id_col':['A','B','C','D'],
'lat':[ 40.8397,40.7664,40.6845,40.6078],
'lon':[-104.9661,-104.999,-105.01,-105.003]
}
df = pandas.DataFrame(data=d)
第一种方法 lambda
和 apply
df['geo_dist']=df.apply(lambda x: geopy.distance.geodesic((x['lat'],x['lon']),(x['lat'].shift(),x['lon']).shift()),axis=1)
我会得到错误:AttributeError: ("'float' object has no attribute 'shift'", u'occurred at index 0')
我的第二种方法是在数据帧上调用函数:
def geodist(x):
return geopy.distance.geodesic((x['lat'],x['lon']),(x['lat'].shift(),x['lon']).shift())
df['geo_dist']=geodist(f)
在这种情况下我会得到错误:ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
非常感谢任何帮助。
第一种方法不会那样工作,因为 lambda 函数应用于 DataFrame 的单行并且 x 不是您期望的所有观察值的列表。为此,您可以使用 x.name-1 获取前一个元素索引并访问 df 中的位置,就像这样
df['geo_dist']=df.apply(lambda x: geopy.distance.geodesic((x['lat'],x['lon']),(df.iloc[x.name - 1].lat,df.iloc[x.name - 1].lon)) if x.name > 0 else 0,axis=1)
希望对您有所帮助