Pandas按条件转换日期变量仅返回spring,该如何调试?
问题原因
- 第一个错误:循环内直接给
labels['season']赋值,这是对整个DataFrame的season列统一赋值,不是给当前遍历行单独赋值。整个循环运行完后,season列的所有值会等于最后一条遍历数据对应的赋值结果,全得到spring说明最后一条数据的月份匹配到了september/sept。 - 第二个错误:条件分支写的是两个独立
if加最后的else,不是if-elif-else的串联结构。就算改对行赋值逻辑也会出错:比如某行月份是september,第一个if命中把值设为spring,第二个if判断不命中,会触发else把值覆盖成no date,根本得不到正确结果。
正确实现方案
推荐用pandas向量化操作,不要写循环,效率更高也不容易出错,示例代码:
方法1:用map映射实现
# 定义月份到季节的映射关系 month_map = { 'september': 'spring', 'sept': 'spring', 'august': 'winter', 'aug': 'winter' } # 提取月份字段后映射,未匹配到的填充为no date labels['month'] = labels['str_date'].fillna('-1').str.split().str[0] labels['season'] = labels['month'].map(month_map).fillna('no date')
方法2:用np.select条件判断实现
如果需要保留多条件判断的逻辑,用numpy的select方法更清晰:
import numpy as np labels['month'] = labels['str_date'].fillna('-1').str.split().str[0] conditions = [ labels['month'].isin(['september', 'sept']), labels['month'].isin(['august', 'aug']) ] values = ['spring', 'winter'] labels['season'] = np.select(conditions, values, default='no date')
内容的提问来源于stack exchange,提问作者Helena
相关产品推荐
相关产品推荐

