请求修正基于df.loc的飞行阶段计算代码(pphase异常)
修正飞行阶段计算代码中的前阶段逻辑问题
问题分析
你的代码存在两个核心问题:
- 函数参数是
df_to_be_computed,但内部直接使用未定义的df,会引发错误或意外修改原数据。 pphase列基于初始全0的flight_phase生成,后续更新flight_phase时pphase不会同步更新,导致判断前一阶段时始终用的是初始0值,完全失效。
修正方案
- 先创建输入数据的副本,避免修改原数据集;
- 不再提前生成
pphase列,而是在每个阶段的条件判断中直接使用df['flight_phase'].shift(1),实时获取前一行已计算出的飞行阶段值; - 确保阶段赋值的逻辑顺序合理,高优先级的阶段(如引擎停止)先判断,避免被低优先级覆盖。
修正后的代码示例
# 飞行阶段定义: # 1) 引擎停止 # 2) 滑行离场 # 3) 起飞 # 4) 中断起飞 # 5) 第二阶段爬升 # 6) 初始爬升 # 7) 爬升 # 8) 巡航 # 9) 下降 # 10) 进近 # 11) 最终进近 # 12) 复飞 # 13) 着陆 # 14) 滑行进场 def compute_flight_phase(df_to_be_computed): # 创建副本,避免修改原数据 df = df_to_be_computed.copy() # 初始化飞行阶段列 df['flight_phase'] = 0 # 1) 引擎停止 df.loc[df['radioHeight-2a'] < 50, 'flight_phase'] = 1 # 2) 滑行离场 # 直接用flight_phase.shift(1)获取前一阶段值,替代原pphase列 taxi_out_cond = (df['eng_stopped'] == 0) & \ (df['wOW-3a'] == 1) & \ (df['eng_takeoff'] == 0) & \ ( (df['flight_phase'].shift(1) < 5) | ((df['eng_2started'] == 1) & (df['groundSpeed-1a'] < df['gsc_min'])) | ((df['flight_phase'].shift(1) == 14) & ((df['eng_cruise'] == 1) | (df['conf'] > df['conf'].shift(-1)))) ) df.loc[taxi_out_cond, 'flight_phase'] = 2 # 后续其他阶段的计算逻辑同理,均使用flight_phase.shift(1)获取前阶段值 # ...(此处补充剩余阶段的代码) # 如果需要保留前阶段列,可在所有阶段计算完成后生成 df['pphase'] = df['flight_phase'].shift(1) return df
额外说明
- 若飞行阶段存在互斥性,需确保判断顺序合理:比如引擎停止的条件应优先于滑行等阶段,避免符合引擎停止条件的行被错误赋值为其他阶段;
- 对于依赖后续行数据的判断(如
df['conf'] > df['conf'].shift(-1)),需注意数据末尾的shift(-1)会产生NaN值,可根据实际情况添加pd.notna()条件过滤。
内容的提问来源于stack exchange,提问作者Tfmr_uk
相关产品推荐
相关产品推荐

