gpt4 book ai didi

python - Pandas 将功能应用于多列和多行

转载 作者:太空狗 更新时间:2023-10-29 20:20:09 25 4
gpt4 key购买 nike

我有一个数据框,在“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

没有迭代的解决方案的执行时间,有应用:0.17s

EdChum 使用 diff() 接受答案的执行时间,没有迭代也没有应用:0.001s

建议:不要使用迭代或应用,始终尝试使用向量化计算;)它不仅速度更快,而且可读性更好。

最佳答案

您可以通过以下方法执行此操作,我将 pandas 方式与您的方式进行了比较,速度快了 1000 多倍,而且还没有将列表作为新列添加回来!这是在 10000 行数据帧上完成的

In [108]:

%%timeit
import numpy as np
df['angle'] = np.abs(180/math.pi * np.arctan(df['xpos'].shift() - df['xpos']/df['ypos'].shift() - df['ypos']))

1000 loops, best of 3: 1.27 ms per loop

In [100]:

%%timeit
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)
1 loops, best of 3: 1.29 s per loop

此外,如果可能,请避免使用 apply,因为这是按行操作的,如果您能找到一种可以在整个系列或数据帧上工作的矢量化方法,那么总是喜欢这种方法。

更新

由于您只是从前一行中减去,因此有针对此 diff 的内置方法,这会产生更快的代码:

In [117]:

%%timeit
import numpy as np
df['angle'] = np.abs(180/math.pi * np.arctan(df['xpos'].diff(1)/df['ypos'].diff(1)))

1000 loops, best of 3: 1.01 ms per loop

另一个更新

还有一个用于序列和数据帧划分的内置方法,这现在节省了更多时间,我实现了低于 1 毫秒的时间:

In [9]:

%%timeit
import numpy as np
df['angle'] = np.abs(180/math.pi * np.arctan(df['xpos'].diff(1).div(df['ypos'].diff(1))))

1000 loops, best of 3: 951 µs per loop

关于python - Pandas 将功能应用于多列和多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24202110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com