首页 > 解决方案 > 在 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 中检查这两个条件,则到目前为止还没有成功

标签: pythonif-statementconditional-statements

解决方案


您不能使用逻辑运算符/with,pandas.Series因为它们将测试系列的真值(基本上bool(dfyz['year_x'] == datetime.now().year)在您的情况下调用 - 这将失败 -> ValueError)。原因是,您实际上有一个布尔数组,其中可能同时包含TrueFalse,这就是为什么它建议您聚合值(anyall)。

|但是,您可以在系列上使用(for or) 或&(for and) 等按位运算。在numpy/ pandasworld 中,这些按位运算指的是元素比较

您可以在PEP-535讨论Rich comparison chaining中找到有关技术原因的更多背景信息。这个 PEP 也带来了一些希望,即未来可能会发生变化。

或者,pandas.DataFrame提供了一个很棒的方法query,它允许您以更整洁的方式查询数据框,使您能够直接引用您的列并使用经典的逻辑运算符。

result = df.query("(name == 'abc') or (age < 25)")

您可以通过在字符串中添加前缀来访问变量@。例如,您可以在查询字符串中执行now = datetime.now()并引用它。@now


推荐阅读