我有一个包含连续像素坐标(行和列)'xpos','ypos' 的 dataframe,我想要计算相邻像素之间路径的角度。目前,我有下面的解决方案,它能正常工作,并且对于我的数据大小来说速度足够快,但是遍历所有行似乎不是 pandas 应该处理的方式。我知道如何将函数应用到不同的列,以及如何将函数应用到不同行的列,但是无法理解如何结合两者。
这是我的代码:
fix_df = pd.read_csv('fixations_out.csv')
# wyliczanie kąta sakady
temp_list=[]
for count, row in df.iterrows():
x1 = row['xpos']
y1 = row['ypos']
try:
x2 = df['xpos'].ix[count-1]
y2 = df['ypos'].ix[count-1]
a = abs(180/math.pi * math.atan((y2-y1)/(x2-x1)))
temp_list.append(a)
except KeyError:
temp_list.append(np.nan)
然后我将临时列表插入到df中。
编辑: 在实施评论中的提示后,我的代码如下:
df['diff_x'] = df['xpos'].shift() - df['xpos']
df['diff_y'] = df['ypos'].shift() - df['ypos']
def calc_angle(x):
try:
a = abs(180/math.pi * math.atan((x.diff_y)/(x.diff_x)))
return a
except ZeroDivisionError:
return 0
df['angle_degrees'] = df.apply(calc_angle, axis=1)
我对我的df进行了三种解决方案的时间比较(df的大小约为6k行),迭代方式几乎比apply慢9倍,比不使用apply慢大约1500倍:
包括将新列插入到df中的迭代解决方案的执行时间:1.51秒
使用apply的无迭代解决方案的执行时间:0.17秒
使用diff()的EdChum的答案的执行时间,无迭代和无apply:0.001秒
建议:不要使用迭代或apply,始终尝试使用向量化计算;这不仅更快,而且更易读。
df['xpos'].shift() - df['xpos']
,而不是逐行执行此操作,然后您可以在整个列上使用您的函数计算角度。 - EdChum