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