2016-06-08 5 views
5

Ich möchte die Zelle Werte einer Dataframe-Spalte (Alter) ändern, wo derzeit leer ist und ich würde es nur tun, wenn eine andere Spalte (Survived) den Wert 0 für die entsprechende Zeile hat wo es für Age leer ist. Wenn es in der Survived-Spalte 1 ist, aber in der Age-Spalte leer ist, behalte ich es als null.Pyspark: mehrere Bedingungen in When-Klausel

Ich habe versucht, && Operator zu verwenden, aber es hat nicht funktioniert. Hier ist mein Code:

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

Irgendwelche Vorschläge, wie man damit umgeht? Vielen Dank.

Fehlermeldung:

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

Antwort

22

Sie erhalten SyntaxError Fehler Ausnahme, weil Python keine && Operator hat. Es hat and und &, wobei letzteres die richtige Wahl ist, boolesche Ausdrücke auf Column (| für eine logische Disjunktion und ~ für logische Negation) zu erstellen.

Bedingung, die Sie erstellt haben, ist auch ungültig, weil operator precedence nicht berücksichtigt wird. & in Python hat eine höhere Priorität als ==, so dass der Ausdruck in Klammern gesetzt werden muss.

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

Auf einer seitlichen Anmerkung ist when Funktion case Ausdruck nicht WHEN Klausel gleichwertig. Es gelten immer noch dieselben Regeln. Verbindung:

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

Disjunction:

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

Sie natürlich Bedingungen definieren können separat Klammern zu vermeiden:

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

cond1 & cond2 
-1

es sein sollte:

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