pyspark 如何在不等于条件下使用OR运算符

gab6jxml  于 2023-04-29  发布在  Spark
关注(0)|答案(3)|浏览(144)

我试图写一个片段,以获得结果或不等于条件,但我的代码不工作。
| Col1|Col2|
| --------------|--------------|
| 12345;3456767890|文本|
| 34567;9876565432|文本|
我的条件是细胞不应该包含12345或67890。所以理想情况下,我希望第一行为FALSE,第二行为TRUE。下面是我写的代码

(~F.col("Col1").like("%12345%")) | (~F.col("Col1").like("%67890%"))

但是上面代码的结果对于两行都是TRUE。有人能纠正我哪里错了吗?

6tr1vspr

6tr1vspr1#

您可以将rlike与 *pipe/或 *(|)一起使用:

out = df.withColumn("Result", ~F.col("Col1").rlike("12345|67890"))

或者按照您的方法,您需要添加缺少的括号:

(~(F.col("Col1").like("%12345%")) | ~(F.col("Col1").like("%67890%")))

输出:

out.show(truncate=False)
​
+-----------------+----+------+
|Col1             |Col2|Result|
+-----------------+----+------+
|12345;34567;67890|Text|false |
|34567;98765;65432|Text|true  |
+-----------------+----+------+
tp5buhyn

tp5buhyn2#

我的条件是细胞不应该包含12345或67890。
尽管我们在日常英语中是这样表达的,你应该只用&而不是|.
逻辑是字符串不包含12345,也不包含67809。

mf98qq94

mf98qq943#

您可以使用XOR来评估只有一个条件为真。

condition1 = F.col("Col1").like("%12345%")
condition2 = F.col("Col1").like("%67890%")

result = (condition1 & ~(condition2)) | (~(condition1) & condition2)

输出:df.withColumn("Result", result).show()
| Col1|Col2|结果|
| --------------|--------------|--------------|
| 12345;3456767890|文本|假的|
| 34567;9876565432|文本|假的|
| 12345;65432|文本|真|

pysparkwhen

condition1 = F.col("Col1").like("%12345%")
condition2 = F.col("Col1").like("%67890%")

result = (
    F.when(condition1 & ~condition2, "Condition 1 True")
    .when(~condition1 & condition2, "Condition 2 True")
    .otherwise("Neither condition is True")
)

输出:df.withColumn("Result", result).show()
| Col1|Col2|结果|
| --------------|--------------|--------------|
| 12345;3456767890|文本|都不是条件。..|
| 34567;9876565432|文本|都不是条件。..|
| 12345;65432|文本|条件1真|

XOR的工作原理如下:

True ^ True == False
True ^ False == True
False ^ True == True
False ^ False == False

如果两个条件的值相同,则可以对该值求反以获得true:

not (condition ^ condition)

示例:

not (True ^ True) == True
not (True ^ False) == False
not (False ^ True) == False
not (False ^ False) == True

相关问题