当我使用 shift 时重复操作,枚举?还是调试?

replicated operation when I use shift, enumerate? or a Debug?

我正在使用 python 来计算 2 列中行之间的差异。我使用函数减去 row1-row2,然后提升为平方并应用平方根来消除负号。然后函数移动到row2-row3 以此类推分隔一行,结果保存在一列中。下一步是计算 row1-row3 的减法,并保持该序列直到值结束...为了建立行之间的分隔,我构建了一个班次列表。显然我的清单没问题。我使用的数据如下:

df1
Out[44]: 
   TRACK_ID  POSITION_X  POSITION_Y  POSITION_T
0         0           1           1       35.36
1         0           2           2       35.52
2         0           3           3       35.68
3         0           4           4       35.84
4         0           1           1       35.36
5         0           4           3       34.88
6         0           2           3       34.40
7         0           6           4       33.92
8         0           4           2       33.44

这是我的输出:

rad
Out[28]: 
          0         1         2         3         4         5         6  \
0  1.414214  2.828427  4.242641  0.000000  3.605551  2.236068  2.236068   
1  1.414214  2.828427  1.414214  2.236068  1.000000  4.472136  4.472136   
2  1.414214  2.828427  1.000000  1.000000  3.162278  1.414214  1.414214   
3  4.242641  1.000000  2.236068  2.000000  2.000000       NaN       NaN   
4  3.605551  2.236068  5.830952  3.162278       NaN       NaN       NaN   
5  2.000000  2.236068  1.000000       NaN       NaN       NaN       NaN   
6  4.123106  2.236068       NaN       NaN       NaN       NaN       NaN   
7  2.828427       NaN       NaN       NaN       NaN       NaN       NaN   
8       NaN       NaN       NaN       NaN       NaN       NaN       NaN   

          7   8  
0  3.162278 NaN  
1       NaN NaN  
2       NaN NaN  
3       NaN NaN  
4       NaN NaN  
5       NaN NaN  
6       NaN NaN  
7       NaN NaN  
8       NaN NaN  

如何看到第 5 列和第 6 列相同,然后跳转到第 7 列中的正确系列

我的全部代码如下:

df1 = df[['TRACK_ID','POSITION_X','POSITION_Y','POSITION_T']].copy()



#Parameter input

N = df1.groupby('TRACK_ID').size()          
max_time = N*(0.160)
frames = max_time/N
t_step=frames.item()


data = pd.DataFrame({'N':N,'max_time':max_time,'frames':frames})

print(data)

t=np.linspace(0.160, max_time.item(), N)




def radial(df1, coords=['POSITION_X', 'POSITION_Y']):


        tau = t.copy()
        shifts = np.divide(tau,t_step).astype(float)
        print(shifts)
        radials = list()

        for i, shift in enumerate(shifts):
            diffs = np.array(df1[coords] - df1[coords].shift(-shift))
            sqdist = np.square(diffs).sum(axis=1)
            r = np.sqrt(sqdist)
            radials.append(r)


        radial_disp = pd.DataFrame({'radials':radials})
        return radials


radial_d = radial(df1, coords=['POSITION_X', 'POSITION_Y'])

radd = pd.DataFrame.from_records(radial_d) #horizontal
rad = radd.transpose() #vertical

当我打印轮班列表时,一切看起来都不错:

shifts
[ 1.  2.  3.  4.  5.  6.  7.  8.  9.]

所以,我不明白这是什么问题,在此先感谢!

好的,我想我已经在您的代码中找到了错误。

只需更改:

for i, shift in enumerate(shifts):

至:

for i, shift in enumerate(np.round(shifts,0)):

应该可以解决您的问题。

问题是您原来的 shifts 变量是浮动的,当您这样做时:

list(enumerate(shifts))

输出如下:

Out[1923]: 
[(0, 1.0),
 (1, 2.0),
 (2, 3.0),
 (3, 4.0),
 (4, 5.0),
 (5, 6.0),
 (6, 6.9999999999999991),
 (7, 8.0),
 (8, 9.0)]

当 6.9999999999999991 转换为 int 时,它变成 6 而不是 7。