根据 python 中的索引遍历数据帧的行

Iterate over rows of a dataframe based on index in python

我正在尝试构建一个循环,该循环遍历多个数据帧的每一行以创建两个新列。原始数据帧包含两列(时间、速度),它们的长度可以变化并存储在嵌套字典中。这是其中之一的例子:

 time  velocity
0   0.000000  0.136731
1   0.020373  0.244889
2   0.040598  0.386443
3   0.060668  0.571861
4   0.080850  0.777680
5   0.101137  1.007287
6   0.121206  1.207533
7   0.141284  1.402833
8   0.161388  1.595385
9   0.181562  1.762003
10  0.201640  1.857233
11  0.221788  2.006104
12  0.241866  2.172649

两个新列应该分别对 'time' 和 'velocity' 列进行规范化。因此,新列的每一行都应等于以下转换:

t_norm = (时间(n) - 时间(n-1)) / (时间(最大) - 时间(分钟))

vel_norm = (速度(n) - 速度(n-1)) / (速度(最大) - 速度(最小))

此外,两个新列的第一个值应设置为 0。

我的问题是我不知道如何正确地向 python 指示如何访问 n 和 n-1 值以实现此类操作,我不知道是否可以这样做使用 pd.DataFrame.iterrows() 或 .iloc 函数。

我提供了以下代码,但它遗漏了关键部分:

for nested_dict in dict_all_raw.values():
    for dflist in nested_dict.values():
        dflist['t_norm'] = ? / (dflist['time'].max() - dflist['time'].min())
        dflist['vel_norm'] = ? / (dflist['velocity'].max() - dflist['velocity'].min())
        dflist['acc_norm'] = dflist['vel_norm'] / dflist['t_norm']

欢迎任何帮助..! :)

您可以使用 shift(参见 the doc here)创建滞后列

df['time_n-1']=df['time'].shift(1)

Also, the first value of the two new column should be set to 0.

计算后使用 df['column']=df['column'].fillna(0)

如果只想归一化,可以直接写表达式,使用Series.minSeries.max

m = df['time'].min()
df['normtime'] = (df['time'] - m) / (df['time'].max() - m)

但是,如果你想要连续元素之间的差异,你可以使用Series.diff:

df['difftime'] = df['time'].diff() / (df['time'].max() - df['time'].min())

测试:

df = pd.DataFrame({'time': [0.000000, 0.020373, 0.040598], 'velocity': [0.136731, 0.244889, 0.386443]})
print(df)
#        time  velocity
# 0  0.000000  0.136731
# 1  0.020373  0.244889
# 2  0.040598  0.386443

m = df['time'].min()
df['normtime'] = (df['time'] - m) / (df['time'].max() - m)

df['difftime'] = df['time'].diff() / (df['time'].max() - df['time'].min())

print(df)
#        time  velocity  normtime  difftime
# 0  0.000000  0.136731  0.000000       NaN
# 1  0.020373  0.244889  0.501823  0.501823
# 2  0.040598  0.386443  1.000000  0.498177