【问题标题】:Ternary operations: "The truth value of a Series is ambiguous" error三元运算:“系列的真值不明确”错误
【发布时间】:2021-08-13 02:19:58
【问题描述】:
df.mto_mts = "MTO" if df.MTO_STRAT == "" else "MTS" if df.MTO_STRAT == "Z5" else "SS"

我已经看到有关|or 的答案-我猜else 条件可能是隐藏的或破坏事物的操作?有什么更好的写法?

【问题讨论】:

    标签: python python-3.x pandas conditional-operator


    【解决方案1】:

    Python if-else 语句无法处理 Pandas 系列布尔数组,因此出现错误。您必须使用可以以矢量化方式处理系列的 Pandas 或 Numpy 函数。

    在这种情况下,您可以使用np.select(),如下所示:

    import numpy as np
    
    condlist = [df.MTO_STRAT == "", df.MTO_STRAT == "Z5"]
    choicelist = ["MTO", "MTS"]
    df.mto_mts = np.select(condlist, choicelist, default="SS")
    

    【讨论】:

      【解决方案2】:

      默认行为是广播比较运算符,为每个比较生成一个由布尔值组成的序列。也就是说,df.MTO_STRAT == "" 基本上给出了pd.Series([_ == "" for _ in df.MTO_STRAT])。您尝试对每个元素分别评估三元组,并在整个语句的级别而不是比较级别完成广播,但 Python 不知道这是您想要做的。

      要让它这样做,有几种方法。一个是

      df.mto_mts = pd.Series([
          "MTO" if _ == "" 
               else "MTS" if _ == "Z5" 
                   else "SS" 
          for _ in df.MTO_STRAT])`
      

      这是一种更 Pythonic 的形式

      df.mto_mts = df.MTO_STRAT.apply(lambda x: 
          "MTO" if x == "" else "MTS" if x == "Z5" else "SS")
      

      由于您要根据df.MTO_STRATmto_mts 选择一个值,因此另一种选择是只使用字典:

      mts_lookup = ["": "MTO", "Z5": "MTS"]
      df.mto_mts = df.MTO_STRAT.apply(lambda x: mts_lookup.get(x, "SS"))
      

      【讨论】:

        猜你喜欢
        • 2018-01-11
        • 1970-01-01
        • 1970-01-01
        • 2020-06-10
        • 2014-10-28
        • 1970-01-01
        • 1970-01-01
        • 2021-06-26
        • 2017-12-28
        相关资源
        最近更新 更多