2016-06-08 8 views
5

Vorrei modificare i valori della cella di una colonna di dataframe (Age) dove attualmente è vuota e lo farei solo se un'altra colonna (Sopravvissuto) ha il valore 0 per la riga corrispondente dove è vuoto per Age. Se è 1 nella colonna Sopravvissuto ma vuoto nella colonna Età, lo manterrò come null.Pyspark: condizioni multiple in quando clausola

Ho provato a utilizzare l'operatore && ma non ha funzionato. Ecco il mio codice:

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

Qualche suggerimento su come gestirlo? Grazie.

messaggio di errore:

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

risposta

22

Si ottiene SyntaxError eccezione errore perché Python non ha && operatore. Dispone di and e & dove quest'ultimo è la scelta corretta per creare espressioni booleane su Column (| per una disgiunzione logica e ~ per negazione logica).

La condizione creata non è valida perché non considera operator precedence. & in Python ha una precedenza maggiore rispetto a == quindi l'espressione deve essere tra parentesi.

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

Su un lato nota when funzione è equivalente a case espressione non WHEN clausola. Ancora le stesse regole si applicano. Congiunzione:

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

Disjunction:

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

Naturalmente, è possibile definire le condizioni separatamente per evitare le staffe:

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

cond1 & cond2 
-1

Dovrebbe essere:

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