2016-06-08 16 views
5

Chciałbym zmodyfikować wartości komórek kolumny danych (wiek), gdzie obecnie jest ona pusta i zrobiłbym to tylko wtedy, gdyby inna kolumna (zachowana) miała wartość 0 dla odpowiedniego wiersza gdzie jest puste dla Age. Jeśli jest 1 w kolumnie Zachowane, ale puste w kolumnie Wiek, to zachowam ją jako zerową.Pyspark: wiele warunków w przypadku klauzuli

Próbowałem użyć operatora &&, ale nie zadziałało. Oto mój kod:

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

Jakieś sugestie, jak sobie z tym poradzić? Dzięki.

Komunikat o błędzie:

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

Odpowiedz

22

Otrzymasz SyntaxError błędzie wyjątku, ponieważ Python nie ma operatora &&. Ma on and i &, gdzie ten drugi jest prawidłowym wyborem do tworzenia wyrażeń logicznych na Column (| dla logicznego podziału i ~ dla negacji logicznej).

Utworzony warunek jest również nieprawidłowy, ponieważ nie uwzględnia operator precedence. & w języku Python ma wyższy priorytet niż ==, więc wyrażenie musi być nawiasie.

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

Na marginesie when funkcja jest równoważna case wypowiedzi nie WHEN klauzuli. Nadal obowiązują te same zasady. Koniunkcja:

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

alternatywy:

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

Można oczywiście określić warunki oddzielnie w celu uniknięcia nawiasie:

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

cond1 & cond2 
-1

Powinno być:

$when(((tdata.Age == "") & (tdata.Survived == "0")), mean_age_0) 
Powiązane problemy