我有一个数据帧,其行和列“xpos”、“ypos”中具有连续的像素坐标,我想计算连续像素之间每条路径的角度(以度为单位)。目前我有下面介绍的解决方案,该解决方案工作正常,并且对于我的文件大小来说足够快,但迭代所有行似乎不是 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,51s
没有迭代、有 apply 的解决方案的执行时间:0.17s
EdChum 使用 diff() 接受的答案的执行时间,无需迭代且无需应用:0.001s
建议:不要使用迭代或应用,并始终尝试使用向量化计算;)它不仅更快,而且更具可读性。