我有以下数据帧:
Trajectory Direction Resulting_Direction
STRAIGHT NORTH NORTH
STRAIGHT NaN NORTH
LEFT NaN WEST
LEFT NaN WEST
LEFT NaN WEST
STRAIGHT NaN WEST
STRAIGHT NaN WEST
RIGHT NaN NORTH
RIGHT NaN NORTH
RIGHT NaN NORTH
我的目标是在遇到三条直线轨迹时改变方向。因此在这个例子中,我的新列将是Resulting_Direction(假设它最初不在df中)。你知道吗
目前我正在通过逐行if语句来实现这一点。然而,这是痛苦的缓慢和低效。我希望使用一个掩码来设置结果的方向,然后使用fillna(method=“ffill”)。这是我的尝试:
df.loc[:,'direction'] = np.NaN
df.loc[df.index == 0, "direction"] = "WEST"
# mask is for finding when a signal hasnt changed in three seconds, but now has
mask = (df.trajectory != df.trajectory.shift(1)) & (df.trajectory == df.trajectory.shift(-1)) & (df.trajectory == df.trajectory.shift(-2))
df.loc[(mask) & (df['trajectory'] == 'LEFT') & (df['direction'].dropna().shift() == "WEST"),'direction'] = 'SOUTH'
df.loc[(mask) & (df['trajectory'] == 'LEFT') & (df['direction'].dropna().shift() == "SOUTH"),'direction'] = 'EAST'
df.loc[(mask) & (df['trajectory'] == 'LEFT') & (df['direction'].dropna().shift() == "EAST"),'direction'] = 'NORTH'
df.loc[(mask) & (df['trajectory'] == 'LEFT') & (df['direction'].dropna().shift() == "NORTH"),'direction'] = 'WEST'
df.loc[(mask) & (df['trajectory'] == 'RIGHT') & (df['direction'].dropna().shift() == "WEST"),'direction'] = 'NORTH'
df.loc[(mask) & (df['trajectory'] == 'RIGHT') & (df['direction'].dropna().shift() == "SOUTH"),'direction'] = 'WEST'
df.loc[(mask) & (df['trajectory'] == 'RIGHT') & (df['direction'].dropna().shift() == "EAST"),'direction'] = 'SOUTH'
df.loc[(mask) & (df['trajectory'] == 'RIGHT') & (df['direction'].dropna().shift() == "NORTH"),'direction'] = 'EAST'
df.loc[:,'direction'] = df.direction.fillna(method="ffill")
print(df[['trajectory','direction']])
我相信我的问题在df['direction'].dropna().shift()中。如何在非NaN的同一列中找到上一个值?你知道吗
IIUC,问题是检测方向改变的位置,假设在3个连续改变命令的开始:
输出:
相关问题 更多 >
编程相关推荐