我已经阅读了有关如何迭代pandas.DataFrame高效(https://engineering.upside.com/a-beginners-guide-to-optimizing-pandas-code-for-speed-c09ef2c6a4d6)的答案和博客条目,但是我还有一个问题。
当前,我的DataFrame表示一个GPS轨迹,其中包含列时间,经度和纬度。 现在,我想计算一个称为到下一个距离的特征。因此,我不仅要遍历行并在单行上执行操作,还必须在一次迭代中访问后续行。
i=0
for index, row in df.iterrows():
if i < len(df)-1:
distance = calculate_distance([row['latitude'],row['longitude']],[df.loc[i+1,'latitude'],df.loc[i+1,'longitude']])
row['distance'] = distance
除了这个问题,在计算速度,应用平滑或其他类似方法时,我也遇到相同的问题。
另一个例子: 我想搜索速度== 0 m / s的数据点并从这些点传出,我想将所有后续数据点添加到数组中,直到速度达到10 m / s(以寻找从0m / s加速到10m / s。
您对如何编写像possbile这样高效的东西有什么建议吗?
答案 0 :(得分:2)
您可以使用pd.DataFrame.shift
将移位后的序列添加到数据框中,然后通过apply
:馈入函数
def calculate_distance(row):
# your function goes here, trivial function used for demonstration
return sum(row[i] for i in df.columns)
df[['next_latitude', 'next_longitude']] = df[['latitude', 'longitude']].shift(-1)
df.loc[df.index[:-1], 'distance'] = df.iloc[:-1].apply(calculate_distance, axis=1)
print(df)
latitude longitude next_latitude next_longitude distance
0 1 5 2.0 6.0 14.0
1 2 6 3.0 7.0 18.0
2 3 7 4.0 8.0 22.0
3 4 8 NaN NaN NaN
这适用于任意函数calculate_distance
,但是您的算法很可能是矢量化的,在这种情况下,您应该使用按列的Pandas / NumPy方法。