PySpark:when子句中的多个条件

时间:2016-06-08 15:51:37

标签: python apache-spark dataframe pyspark apache-spark-sql

我想修改一个数据帧列(Age)的单元格值,当前它是空白的,我只会在另一列(Survived)的值为0的情况下执行它,对应的行是Age的空白。如果它在Survived列中为1但在Age列中为空,那么我将它保持为null。

我尝试使用&&运算符,但它没有用。这是我的代码:

tdata.withColumn("Age",  when((tdata.Age == "" && tdata.Survived == "0"), mean_age_0).otherwise(tdata.Age)).show()

有任何建议如何处理?感谢。

错误讯息:

SyntaxError: invalid syntax
  File "<ipython-input-33-3e691784411c>", line 1
    tdata.withColumn("Age",  when((tdata.Age == "" && tdata.Survived == "0"), mean_age_0).otherwise(tdata.Age)).show()
                                                    ^

4 个答案:

答案 0 :(得分:67)

由于Python没有SyntaxError运算符,因此会出现&&错误异常。它有and&,其中后一个是在Column上创建布尔表达式的正确选择(|用于逻辑析取,~用于逻辑否定)。

您创建的条件也无效,因为它不考虑operator precedence。 Python中的&优先级高于==,因此表达式必须加括号。

(col("Age") == "") & (col("Survived") == "0")
## Column<b'((Age = ) AND (Survived = 0))'>

旁注when函数等同于case表达式而不是WHEN子句。仍然适用相同的规则。结合:

df.where((col("foo") > 0) & (col("bar") < 0))

分离:

df.where((col("foo") > 0) | (col("bar") < 0))

您当然可以单独定义条件以避免使用括号:

cond1 = col("Age") == "" 
cond2 = col("Survived") == "0"

cond1 & cond2

答案 1 :(得分:1)

它至少应该在pyspark 2.4中工作

tdata = tdata.withColumn("Age",  when((tdata.Age == "") & (tdata.Survived == "0") , "NewValue").otherwise(tdata.Age))

答案 2 :(得分:0)

&& )或( || )条件可以在何时功能

内使用
val dataDF = Seq(
      (66, "a", "4"), (67, "a", "0"), (70, "b", "4"), (71, "d", "4"
      )).toDF("id", "code", "amt")
dataDF.withColumn("new_column",
       when(col("code") === "a" || col("code") === "d", "A")
      .when(col("code") === "b" && col("amt") === "4", "B")
      .otherwise("A1")).show()

======================

Output:
+---+----+---+----------+
| id|code|amt|new_column|
+---+----+---+----------+
| 66|   a|  4|         A|
| 67|   a|  0|         A|
| 70|   b|  4|         B|
| 71|   d|  4|         A|
+---+----+---+----------+

此代码段是从sparkbyexamples.com

复制而来的

答案 3 :(得分:-1)

应该是:

$when(((tdata.Age == "" ) & (tdata.Survived == "0")), mean_age_0)