首页 > 解决方案 > Pandas 数据框 - 使用带有多个“if else”语句的 lambda 应用函数

问题描述

我希望有人可以帮助指出我在以下代码中可能做错了什么:

master_output['tm_override'] = master_output.apply(lambda row: row['nrec_tm_lb'].astype(str) + '-' + row['nrec_tm_ub'].astype(str) if row['det_tw_fact'].isin([4, 5]) else row['tw2Open'] + dt.timedelta(hours=3).time() if (row['det_tw_fact'].isin([1, 2, 3]) and (~row['tw2Open'].isna()))
else row['tw1Open'] + dt.timedelta(hours=3).time() if (row['det_tw_fact'].isin([1, 2, 3]) and (~row['tw2Open'].isna())), axis=1) 

我有一种感觉,我可能在这里做一些根本上愚蠢的事情。问题似乎来自 'axis=1' 参数之前的最后一组括号 (')))')。

在此先感谢您的帮助!

标签: pythonpandas

解决方案


Nick ODell 的评论是正确的。我将您的原件重新格式化为:

master_output['tm_override'] = (
    master_output.apply(lambda row: row['nrec_tm_lb'].astype(str) + '-' + row['nrec_tm_ub'].astype(str) 
    if row['det_tw_fact'].isin([4, 5]) 
    else row['tw2Open'] + dt.timedelta(hours=3).time() 
        if (row['det_tw_fact'].isin([1, 2, 3]) and (~row['tw2Open'].isna()))
        else row['tw1Open'] 
        + dt.timedelta(hours=3).time() 
            if (row['det_tw_fact'].isin([1, 2, 3]) and (~row['tw2Open'].isna())), axis=1)
    )

如果您查看最后一个 if,则没有匹配的 else。您正在处理的是我相信是 DataFrame 吗?您正在尝试将值分配给列,但如果您只有 if 而没有 else,当不满足 if 条件时,则没有值可以填充该列。

我不知道您将在 else 部分中填写什么值。但我试过用''填充。语法错误消失了。

master_output['tm_override'] = (
    master_output.apply(lambda row: row['nrec_tm_lb'].astype(str) + '-' + row['nrec_tm_ub'].astype(str) 
    if row['det_tw_fact'].isin([4, 5]) 
    else row['tw2Open'] + dt.timedelta(hours=3).time() 
        if (row['det_tw_fact'].isin([1, 2, 3]) and (~row['tw2Open'].isna()))
        else row['tw1Open'] 
        + dt.timedelta(hours=3).time() 
            if (row['det_tw_fact'].isin([1, 2, 3]) and (~row['tw2Open'].isna()))
            else '', axis=1)
    )

我现在得到的是一个不同的错误,因为我没有 DataFrame,但是您的语法错误已解决。

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-251-72ce849871e0> in <module>
      1 master_output['tm_override'] = (
----> 2     master_output.apply(lambda row: row['nrec_tm_lb'].astype(str) + '-' + row['nrec_tm_ub'].astype(str) 
      3     if row['det_tw_fact'].isin([4, 5])
      4     else row['tw2Open'] + dt.timedelta(hours=3).time()
      5         if (row['det_tw_fact'].isin([1, 2, 3]) and (~row['tw2Open'].isna()))

NameError: name 'master_output' is not defined

推荐阅读