Pandas函数异常:无论Date Type取值,均生成Date Auto与Date Option列
问题原因与解决方案
核心问题
你代码里的DATE_TYPE判断根本没用到原数据中每行的Date Type值——set_date函数是主动分别调用两次calc_date:一次固定传date_type=AUTO来生成Date Auto列,一次固定传date_type=OPTION来生成Date Option列。这两个列是独立计算的,和原数据的Date Type完全无关,自然会同时被设置。
而MY_DATE的判断正常生效,是因为它是基于每行的row['my date']值做校验,逻辑本身没问题,所以会正常过滤空值或日期不满足的情况。
修正方案(按需求调整)
如果你的需求是根据每行的Date Type值,只填充对应列,另一列留空,可以修改逻辑,让calc_date读取当前行的Date Type,而不是用外部传入的固定值:
OPTION = "O" AUTO = "A" TODAYS_DATE = pd.to_datetime('today').normalize() # 补全原代码缺失的日期定义 def calc_date(row): MY_DATE = pd.to_datetime(row['my date'], errors='coerce') DAYS = row['Num Days'] DATE_TYPE = row['Date Type'] # 从当前行读取实际的Date Type值 if pd.isna(MY_DATE) or pd.isna(DAYS): return None, None calculated_date = MY_DATE - pd.to_timedelta(DAYS, unit='d') date_str = calculated_date.strftime('%m/%d/%Y') if not pd.isna(calculated_date) else None # 根据当前行的类型返回对应列的值 if DATE_TYPE == AUTO and MY_DATE > TODAYS_DATE: return date_str, None elif DATE_TYPE == OPTION and MY_DATE > TODAYS_DATE: return None, date_str else: return None, None def set_date(df): new_df = df.copy() # 一次apply生成两列数据 new_df[['Date Auto', 'Date Option']] = new_df.apply(calc_date, axis=1, result_type='expand') return new_df df_new = set_date(df)
补充说明
原代码里的DATE_TYPE = date_type只是把外部传入的固定参数赋值给局部变量,这个变量和原DataFrame中的Date Type列没有任何关联,所以判断逻辑是基于调用时传的固定值,而非每行的实际类型,才会导致两列被同时填充。
内容的提问来源于stack exchange,提问作者Kilgore Trout
相关产品推荐
相关产品推荐

