You can do this with the following method, and I compared the pandas method to your path, and it is more than 1000 times faster, and this does not add the list back as a new column! This was done on a data frame of 10,000 rows.
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
Also, if possible, avoid using apply , as it works differently, if you can find a vector method that can work on the entire series or in a data frame, then always prefer this.
UPDATE
seeing that you are simply subtracting from the previous line, the built-in method for this diff leads to even faster code:
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
Another update
There is also a build method for separating series and data, now it saves more time, and I get sub-1 ms time:
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
Edchum
source share