Python基于if条件创建DataFrame新列时else分支不生效问题
错误原因
- 原生Python的
if-else只能对单个布尔值做判断,你写的条件语句返回的是和DataFrame行数一致的布尔Series,每个行对应一个判断结果,直接放在if条件中无法逐行匹配规则,pandas会触发The truth value of a Series is ambiguous报错,就算未报错也只会取全局判断结果,导致else分支永远无法触发。
修复方案
可以用numpy.where实现逐行条件赋值,代码如下:
import datetime import numpy as np # 提前获取当前年月,避免重复计算 cur_year = datetime.now().year cur_month = datetime.now().month # 定义判断条件 match_cond = (dfyz['year_x'] < cur_year) | ((dfyz['year_x'] == cur_year) & (dfyz['mon'] < cur_month)) # 条件成立取yhat*pct,否则取yhat*pct_ft dfyz['pred_n'] = np.where(match_cond, dfyz['yhat'] * dfyz['pct'], dfyz['yhat'] * dfyz['pct_ft'])
如果不想引入numpy依赖,也可以用pandas原生的loc索引实现:
import datetime cur_year = datetime.now().year cur_month = datetime.now().month match_cond = (dfyz['year_x'] < cur_year) | ((dfyz['year_x'] == cur_year) & (dfyz['mon'] < cur_month)) dfyz.loc[match_cond, 'pred_n'] = dfyz['yhat'] * dfyz['pct'] dfyz.loc[~match_cond, 'pred_n'] = dfyz['yhat'] * dfyz['pct_ft']
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

