[英]Pandas average of the difference between any two consecutive rows in dataframe
[英]Repeated calculation between consecutive rows of pandas dataframe
我想计算沿GPS坐标路径的距离,该坐标存储在数据帧的两列中。
import pandas as pd
df = pd.DataFrame({ 'lat' : [1, 2.5, 3, 1.2],
'lng' : [1, 1, 2.1, 1],
'label': ['foo', 'bar', 'zip', 'foo']})
print df
产量
label lat lng
0 foo 1.0 1.0
1 bar 2.5 1.0
2 zip 3.0 2.1
3 foo 1.2 1.0
GPS坐标以弧度存储。 因此,数据帧的第一行和第二行之间的距离可以如下计算:
import math as m
r1 = 0
r2 = 1
distance =m.acos(m.sin(df.lat[r1]) * m.sin(df.lat[r2]) +
m.cos(df.lat[r1]) * m.cos(df.lat[r2]) * m.cos(df.lng[r2]-df.lng[r1]))*6371
我想在每对连续行之间重复此计算,然后将每个短距离添加到完整路径的较长最终距离。
我可以将它放入数据帧的n-1行的循环中,但是有更多的pythonic方法吗?
矢量化的Haversine
功能:
def haversine(lat1, lon1, lat2, lon2, to_radians=True, earth_radius=6371):
"""
slightly modified version: of http://stackoverflow.com/a/29546836/2901002
Calculate the great circle distance between two points
on the earth (specified in decimal degrees or in radians)
All (lat, lon) coordinates must have numeric dtypes and be of equal length.
"""
if to_radians:
lat1, lon1, lat2, lon2 = np.radians([lat1, lon1, lat2, lon2])
a = np.sin((lat2-lat1)/2.0)**2 + \
np.cos(lat1) * np.cos(lat2) * np.sin((lon2-lon1)/2.0)**2
return earth_radius * 2 * np.arcsin(np.sqrt(a))
解:
df['dist'] = haversine(df['lat'], df['lng'],
df['lat'].shift(), df['lng'].shift(),
to_radians=False)
结果:
In [65]: df
Out[65]:
label lat lng dist
0 foo 1.0 1.0 NaN
1 bar 2.5 1.0 9556.500000
2 zip 3.0 2.1 7074.983158
3 foo 1.2 1.0 10206.286067
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.