【问题标题】:Issue with multiple conditionals within a lambda function being applied to multiple columns将 lambda 函数中的多个条件应用于多个列的问题
【发布时间】:2021-12-07 17:44:44
【问题描述】:

我正在尝试填充标题为“标签”的列,该列是 lambda 函数中条件语句的结果,该函数涉及数据框的两列。我想根据“WY”和“WY Week”列中的特定条件创建数字标签。例如,如果 WY 小于 2010,则标签为 1;如果 WY 大于 2010,则标签为 2;如果 WY 值大于 2010,则标签为 3,WY 周值介于 26 和 40 之间。

我对一列的一个条件没有问题,如下所示:

GC['label'] = GC['WY'].apply(lambda x: 1 if x >= 1985 else 0)

但是当我尝试编写涉及两列和多个条件的条件语句时,我抛出了一个代码:

CJ['label'] = CJ[['WY','WY Week']].apply(lambda x,y: 1 if x < 2010 else (2 if x >= 2010 and (y >= 26 and y <= 40)) else )

错误是语法错误:

File "<ipython-input-21-6b6fa416588d>", line 7
CJ['label'] = CJ[['WY','WY Week'].apply(lambda x,y: 1 if x < 2010 else (2 if x >= 2010) and (y >= 26 and y <= 40) else )
                                                                                      ^
SyntaxError: invalid syntax

我觉得我已经很接近了,但需要一些帮助,因为它是我需要这样编写的几个条件语句之一。

【问题讨论】:

  • 在最后一个else 之后你什么都没有。在这种情况下,值应该是多少?
  • CJ[['WY','WY Week'] 你错过了一个结束]CJ[['WY','WY Week']]。 python (2 if x &gt;= 2010) 中不允许没有 else 的三元运算符你能概述一下你想要完成的事情吗?因为从提供的代码中并不能立即清楚。
  • 另外,最后一个else 需要在(2 if x &gt;= 2010 ...) 括号内。
  • 我建议您不要对lambda 执行此操作,尝试将所有内容放在一行中只会让人感到困惑。定义一个命名函数并使用if 语句。
  • @HenryEcker 我固定了支架。我的疏忽很大。

标签: python pandas conditional-statements


【解决方案1】:

定义一个命名函数,而不是将所有内容都塞进一个复杂的lambda

无需在else 中测试x &gt;= 2010;如果它到达else,那一定是真的。

def labelval(x, y):
    if x < 2010:
        return 1
    elif 26 <= y <= 40:
        return 2
    else:
        return 3

CJ['label'] = CJ[['WY','WY Week']].apply(labelval)

【讨论】:

    【解决方案2】:
    # hopefully a readable function that makes label conditions clear
    def classify(wy, wy_week):
        if wy < 2020:
            return 1
        elif 26 <= wy_week <= 40
            return 2
        else:
            return 3 # I guess?
    
    # fast, vectorized calculation using two columns
    GB['label'] = list(map(classify,GC['WY'],GC['WY Week']))
    

    我最喜欢的最好的堆栈溢出答案之一: Performance of Pandas apply vs np.vectorize to create new column from existing columns

    【讨论】:

    • 我提交的时候没有看到@Barmar's!他的也不错!
    • 这是一个很棒的链接。对 python 和整个编程来说相对较新,因此尝试新事物作为试验,即使它们可能不是最有效的。该链接很有帮助,我想我将结合@Barmar 解决方案以及您的解决方案来完成我正在尝试做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2019-04-04
    • 2015-12-28
    • 2013-01-09
    • 2021-08-09
    相关资源
    最近更新 更多