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()
.
我有一个包含 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()
.