python - 在 python 上使用 if-else 条件基于另一列的值创建新列
问题描述
我正在尝试以下是
import numpy as np
conditions = [
(dfyz['year_x'] < datetime.now().year),
((dfyz['year_x'] == datetime.now().year) and (dfyz['mon'] < datetime.now().month)),
(dfyz['year_x'] > datetime.now().year),
((dfyz['year_x'] == datetime.now().year) and (dfyz['mon'] >= datetime.now().month))
]
values = [dfyz['yhat']*dfyz['pct'], dfyz['yhat']*dfyz['pct'], dfyz['yhat']*dfyz['pct_ft'], dfyz['yhat']*dfyz['pct_ft']]
dfyz['pred_n'] = np.select(conditions,values)
但我收到以下错误
f"The truth value of a {type(self).__name__} is ambiguous.
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我也尝试过另一种方式并在 StackOverflow 中发布,但如果没有在 Python 中检查这两个条件,则到目前为止还没有成功
解决方案
您不能使用逻辑运算符和/或with,pandas.Series
因为它们将测试系列的真值(基本上bool(dfyz['year_x'] == datetime.now().year)
在您的情况下调用 - 这将失败 -> ValueError
)。原因是,您实际上有一个布尔数组,其中可能同时包含True
和False
,这就是为什么它建议您聚合值(any
等all
)。
|
但是,您可以在系列上使用(for or) 或&
(for and) 等按位运算。在numpy
/ pandas
world 中,这些按位运算指的是元素比较。
您可以在PEP-535讨论Rich comparison chaining中找到有关技术原因的更多背景信息。这个 PEP 也带来了一些希望,即未来可能会发生变化。
或者,pandas.DataFrame
提供了一个很棒的方法query
,它允许您以更整洁的方式查询数据框,使您能够直接引用您的列并使用经典的逻辑运算符。
result = df.query("(name == 'abc') or (age < 25)")
您可以通过在字符串中添加前缀来访问变量@
。例如,您可以在查询字符串中执行now = datetime.now()
并引用它。@now
推荐阅读
- javascript - 使用 SMTPJS 和 Mailgun 发送电子邮件失败
- javascript - 使用 CRON NodeJS 和第三方 API,如何避免速率限制?
- java - 在执行器服务java中添加任务集合之间的延迟
- sql - 用不相等的行连接不相关的表
- shell - Unix shell 脚本中的模式匹配
- mongodb - 从 MongoDB Vue.js 获取数据
- multithreading - 如何从我无法控制的线程中捕获内部错误?
- python - xgboost 中的 xgb.predict 和 xgb.predict_proba() 之间的区别?
- vue.js - 未捕获的错误:模块解析失败:意外的令牌 (1:0)。如何在vue中导入pdf文件?
- java - 如何在 BottomSheetDialog 中获取 ViewModel