簡體   English   中英

PySpark:when子句中的多個條件

[英]PySpark: multiple conditions in when clause

我想修改數據幀列(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()
                                                    ^

你得到SyntaxError錯誤異常,因為Python沒有&&運算符。 它具有and & ,其中后者是在Column上創建布爾表達式的正確選擇( |用於邏輯析取,而~用於邏輯否定)。

您創建的條件也無效,因為它不考慮運算符優先級 &在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 2.4中起作用

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

pyspark中 ,可以使用 (for和)和|來構建多個條件 (for或)。

注意:在pyspark中,重要的是將括號內的每個表達式括起來組合形成條件

%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代碼( && )或( || )中,條件可以函數內使用

//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復制的

它應該是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM