2016-06-08 96 views
5

中的多個條件我想修改一個數據幀列(Age)的單元值,當前它是空白的,我只會在另一列(Survived)的值爲0 Age的空白處。如果它在Survived列中爲1,但在Age列中爲空白,那麼我將保留它爲空。Pyspark:在條款

我試圖使用&&運營商,但它沒有奏效。這裏是我的代碼:

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

回答

22

你得到SyntaxError錯誤例外,因爲Python有沒有&&運營商。它有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

它應該是:

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