PySpark:when claus中的多个条件

2024-06-30 15:20:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想修改当前为空的dataframe列(Age)的单元格值,并且仅当另一列(Survived)的对应行的值为0(其中Age为空)时才执行此操作。如果存活列中的值为1,而年龄列中的值为空,则将其保留为空。

我试图使用&&运算符,但它不起作用。这是我的代码:

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()
                                                    ^

Tags: 代码dataframeageshow错误运算符mean建议
3条回答

它应该至少在Pyspark2.4中有效

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

因为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

pyspark中的时,可以使用&;(for and)和|(for or)创建多个条件。

注意:在pyspark中,t必须将每个组合成条件的表达式括在括号()中

%pyspark
dataDF = spark.createDataFrame([(66, "a", "4"), 
                                (67, "a", "0"), 
                                (70, "b", "4"), 
                                (71, "d", "4")],
                                ("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()

在Spark Scala代码中(&;)或(|)条件可在when函数中使用

//scala
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复制的

相关问题 更多 >