【问题标题】:Inlie series of IFs present The truth value of a Series is ambiguous ErrorInlie series of IFs present The Truth value of a Series is ambiguous Error
【发布时间】:2021-12-28 05:36:59
【问题描述】:

我正在尝试根据一系列 if 条件在 Pandas DataFrame 中添加和填充一列。 我的代码是这样的

df['E'] = (('Text1;' if df['A'] else '') + ('Text2;' if df['B'] else '')) + ('Text3;' if df['C'] else '')

数据框看起来像

A       B        C        D
TRUE    FALSE    FALSE    4
FALSE   TRUE     TRUE     7
FALSE   FALSE    FALSE    1

编译器错误提示真值不明确,我尝试按照 SO 的建议使用括号,但无法使其正常工作。

我已经围绕这个错误检查了 SO 上的许多其他线程,但没有一个指向这个问题。

谢谢

【问题讨论】:

  • 你检查了很多你看到的线程 np.where? np.选择?你用它写什么?或者你有没有为此尝试过矩阵乘法
  • 感谢@athing 的评论,我检查了我搜索的那些,但我无法弄清楚如何根据 np.select 中的多个 if 连接字符串你能告诉我我的方法有什么问题吗?
  • 如果您添加数据框以便其他人可以重现错误也会有所帮助
  • 真相价值不明确是你的方式有什么问题,有很多答案为什么它是错误的。有些人建议 np.select 等。我认为在最坏的情况下,您在“检查许多 therads”之后在 np.select 中写入 8=2^3 可能性。有一种矩阵乘法的方式让我试着写一个答案
  • 你的数据框真的像这样吗?因为所有大写字母 TRUE 和 FALSE 它们肯定不是布尔值...

标签: python python-3.x pandas dataframe lambda


【解决方案1】:

您的方法不起作用,因为:如果其他系列和 dfs 不好,并且有很多 QA,为什么它是错误的以及该怎么做。

但您仍然可以在检查 np.select 后尝试 2^3 种可能性,但您没有显示出这样的尝试。

矩阵 mul 还有另一种方式:

#pd.Index plays better than list when it comes to @ below
texts = pd.Index(["Text1;", "Text2;","Text3;"])
#choose interested columns
columns = ["A","B","C"]
#perform matrix mult and assign
df["E"] = df[columns] @ texts

这里与@ 的矩阵乘法是“乘积之和”。它产生 3 个这样的总和,例如 "Text1;" * True + "Text2;" * False + "Text3;" * False 用于第一个 E 结果。这是您可能知道的通常的矩阵乘法

df变成

       A      B      C  D             E
0   True  False  False  4        Text1;
1  False   True   True  7  Text2;Text3;
2  False  False  False  1

2^3 方式与 np.select。我们形成从 000 到 111 的“逻辑表”

conditions = [
    ~df.A & ~df.B & ~df.C,
    ~df.A & ~df.B &  df.C,
    ~df.A &  df.B & ~df.C,
    ~df.A &  df.B &  df.C,
     df.A & ~df.B & ~df.C,
     df.A & ~df.B &  df.C,
     df.A &  df.B & ~df.C,
     df.A &  df.B &  df.C,
]

chooses = [
    "",
    "Text3;",
    "Text2;",
    "Text2;Text3;",
    "Text1;",
    "Text1;Text3;",
    "Text1;Text2;",
    "Text1;Text2;Text3;",
]

df["E"] = np.select(conditions,chooses)

df现在和上面一样。

【讨论】:

  • 老兄,我还没有完全理解,但这就像一个魅力。感谢您的光临并通过!
  • 如果您也可以分享选择 2^3 方式,我们将不胜感激
  • @Muds 第一种方式是矩阵乘法,我们使用 True 为 1 作为数字,而 False 为 0。我也将第二种 2^n 方式与 np.select 一起使用
猜你喜欢
  • 2018-10-05
  • 2018-03-31
  • 2021-01-29
  • 2023-02-03
  • 2020-08-25
  • 2015-09-21
  • 2018-11-16
  • 1970-01-01
  • 2023-02-09
相关资源
最近更新 更多