如何在Lambda函数中使用多条件判断?基于DataFrame生成Status列
解决DataFrame基于日期生成status列的问题
我来帮你搞定这个需求,咱们先把规则理清楚,再一步步修正代码里的问题。
明确需求规则
首先再确认一遍你要的逻辑:
- 如果
Date是"X"或"Y",或者等于当前日期,status设为Current - 如果
Date大于当前日期,status设为SW Expired - 如果
Date小于当前日期,status设为SW Expires {年份}-Q{季度}(比如SW Expires 2018-Q4) - 其他任何不符合上述情况的值,
status设为NA
原代码的问题分析
你写的代码有几个明显的问题:
- 重复定义
df['Qtr'],而且没处理Date是"X"/"Y"的情况,直接用pd.to_datetime会报错 - Lambda表达式的逻辑完全混乱,三元运算符嵌套语法错误,还错误引用了其他DataFrame的列
- 判断顺序不对,应该先处理特殊值(X/Y、等于当前日期),再处理日期的大小比较
正确实现代码
我给你写了一个清晰的自定义函数,比Lambda更容易维护,也能处理所有边界情况:
import pandas as pd from datetime import datetime # 1. 获取当前日期(只保留日期部分,去掉时分秒,避免时间干扰) current_date = datetime.now().date() # 2. 定义处理每个Date值的函数 def get_status(date_val): # 先处理特殊字符串值X/Y if isinstance(date_val, str) and date_val in ["X", "Y"]: return "Current" # 尝试将值转为日期类型,失败则返回NA try: date = pd.to_datetime(date_val).date() except (ValueError, TypeError): return pd.NA # 处理等于当前日期的情况 if date == current_date: return "Current" # 处理日期晚于当前的情况 elif date > current_date: return "SW Expired" # 处理日期早于当前的情况,生成季度格式 elif date < current_date: year = date.year quarter = (date.month - 1) // 3 + 1 return f"SW Expires {year}-Q{quarter}" # 其余情况返回NA else: return pd.NA # 3. 应用函数到DataFrame的Date列 df['status'] = df['Date'].apply(get_status)
测试示例
用你给出的测试数据验证一下(模拟当前日期为2019-06-19):
# 测试数据 test_df = pd.DataFrame({ "Date": ["2019-06-28", "2020-01-20", "2018-07-18", "X", "Y", "2019-06-19"] }) # 模拟当前日期 current_date = datetime(2019, 6, 19).date() test_df['status'] = test_df['Date'].apply(get_status) print(test_df)
输出结果:
Date status 0 2019-06-28 SW Expired 1 2020-01-20 SW Expired 2 2018-07-18 SW Expires 2018-Q3 3 X Current 4 Y Current 5 2019-06-19 Current
这里注意你之前的示例里把2018-07-18写成了SW Expired,其实它早于当前日期,应该生成季度格式,我这里已经修正了这个逻辑。
内容的提问来源于stack exchange,提问作者PCH
相关产品推荐
相关产品推荐

