Python 循环:在索引进行时无法进行计算

Python Loop: Having trouble making calculations as the Index progresses

我有一个包含 x 坐标的 1 列(和许多行)的数据框。我的目标是随着索引的进行,对每个坐标之间的差异求和。

例如: (x_coordinate[1] - x_coordinate[0]) + (x_coordinate[2] - x_coordinate[1]) 等等(通过相当大的数据集)。

我的尝试在下面的代码中进行了概述——我基本上尝试创建两个与数据帧索引对齐的渐进变量 (i, k),然后将这些值存储为变量,将它们彼此相减,然后将该值添加到列表中——然后在将所有差异放入列表后,我将对列表中的所有值求和。

问题是,当我 运行 这段代码时,它只给出了前两个索引的差异。

另外,如果它是相关的——获得这个值的目的是将它用作进一步计算的一部分——计算物体的速度。

    def calc_distance(dataf): 
        dataf.reset_index()
        i = 0
        k = 1
        mylist = []
        lengthDf = len(df)
        while i < lengthDf:
            val_1 = dataf.Object_Center_0.iloc[i]
            val_2 = dataf.Object_Center_0.iloc[k]
            y = val_2 - val_1
            mylist.append(y)
            distance_traveled = sum(mylist)
            k+=1
            i+=1
           return distance_traveled
    calc_distance(df)

下面是 df.head(10) -- object_center_0 在这种情况下仅表示 x 坐标

Object_Center_0
0   542.299805
1   544.108215
2   545.300598
3   546.417053
4   546.198669
5   546.724915
6   547.037048
7   547.011963
8   547.649231
9   547.600525

IIUC,你想要这样的东西:

# Cumulative distance
>>> df['Object_Center_0'].sub(df['Object_Center_0'].shift()) \
                         .cumsum().fillna(0).cumsum()

0     0.000000
1     1.808410
2     4.809203
3     8.926451
4    12.825315
5    17.250425
6    21.987668
7    26.699826
8    32.049252
9    37.349972
Name: Object_Center_0, dtype: float64

你只得到前两个坐标之间差异的原因是你的 return 语句 return distance_traveled 在你的 while 表达式的第一个循环完成并退出你的函数。 . 一个函数只能return一次。如果您正确地缩进了 return 语句,使其在 while 循环完成后执行 那么它应该可以解决您的问题。

    def calc_distance(dataf): 
        dataf.reset_index()
        i = 0
        k = 1
        distance_traveled = 0
        lengthDf = len(df)
        while i < lengthDf:
            val_1 = dataf.Object_Center_0.iloc[i]
            val_2 = dataf.Object_Center_0.iloc[k]
            y = val_2 - val_1
            distance_traveled += y
            k+=1
            i+=1
       return distance_traveled # back one indent
    calc_distance(df)

也就是说,使用 pandas 功能有一个更简单的解决方案。

df['diff'] = df['Object_Center_0'].diff()
df['cumdiff'] = df['Object_Center_0'].diff().cumsum()


Object_Center_0     diff     cumdiff
0   542.299805       NaN         NaN
1   544.108215  1.808410    1.808410
2   545.300598  1.192383    3.000793
3   546.417053  1.116455    4.117248
4   546.198669  -0.218384   3.898864
5   546.724915  0.526246    4.425110
6   547.037048  0.312133    4.737243
7   547.011963  -0.025085   4.712158
8   547.649231  0.637268    5.349426
9   547.600525  -0.048706   5.300720

您可以通过输入

来获取您的单一值
df['diff'].sum()

5.300719999999956

最后一件事要知道,您的 reset_index 表达式不会改变您的数据框。为此,您需要键入 dataf.reset_index(inplace=True)。这告诉 pandas 改变原始数据帧。或者您可以将值传递到新数据框 dataf = dataf.reset_index().