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


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

我已经看到了关于|or的答案——我想其他条件可能是隐藏的或破坏事物的操作?写这篇文章有什么更好的方法?

Pythonif-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])`

是一种更像Python的形式

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

相关内容

  • 没有找到相关文章

最新更新