Pandas DataFrame使用带多if else的lambda apply函数报错排查
问题排查
1. 语法错误
- 单值误用
isin()方法:row['det_tw_fact']是取出单行的单个标量值,isin()是Pandas Series/数组的批量判断方法,标量不能调用该方法,需改为Python原生的in关键字判断。 - 三元表达式结构缺失:Python三元表达式规则为
值1 if 条件 else 值2,你最后一条if判断后没有对应的else兜底分支,属于语法不完整。 - 括号不匹配:
axis=1前的最后一个if判断的外层左括号没有闭合,导致语法解析失败,和你初步怀疑的括号位置问题一致。 - 时间类型运算错误:
datetime.time类型对象不支持直接相加,你直接用row['tw2Open'] + dt.timedelta(hours=3).time()属于非法运算,正确做法是将时间转为datetime类型加时间差后再提取时间部分。
2. 逻辑错误
- 分支条件重复:第二个、第三个
if判断的条件完全一致,导致第三个分支永远不会触发,推测你第三个分支的判断条件应为row['tw2Open'].isna()(即tw2Open为空时走tw1Open的逻辑)。
修正后参考代码
import datetime as dt import pandas as pd def calc_tm_override(row): det_tw = row['det_tw_fact'] # 处理det_tw为4、5的情况 if det_tw in [4,5]: return f"{str(row['nrec_tm_lb'])}-{str(row['nrec_tm_ub'])}" # 处理det_tw为1、2、3的情况 elif det_tw in [1,2,3]: # 时间相加的正确处理:先转datetime加时间差再取time if pd.notna(row['tw2Open']): return (dt.datetime.combine(dt.date.today(), row['tw2Open']) + dt.timedelta(hours=3)).time() elif pd.notna(row['tw1Open']): return (dt.datetime.combine(dt.date.today(), row['tw1Open']) + dt.timedelta(hours=3)).time() # 兜底分支,可根据业务需求调整返回值 else: return pd.NA master_output['tm_override'] = master_output.apply(calc_tm_override, axis=1)
注:如果你的
tw1Open/tw2Open字段本身就是datetime类型而不是time类型,直接加dt.timedelta(hours=3)后再调用.time()即可,不需要额外用datetime.combine转换。
内容的提问来源于stack exchange,提问作者Hayford K Adjavor
相关产品推荐
相关产品推荐

