三元运算:"The truth value of a Series is ambiguous" 错误

Ternary operations: "The truth value of a Series is ambiguous" error

df.mto_mts = "MTO" if df.MTO_STRAT == "" else "MTS" if df.MTO_STRAT == "Z5" else "SS"

我看过关于 |or 的答案 - 我猜 else 条件可能是一个隐藏的或正在破坏事物的操作?什么是更好的写法?

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")

默认行为是广播比较运算符,为每个比较生成一个由布尔值组成的系列。即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_STRAT 选择 mto_mts 的值,另一种选择是仅使用字典:

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