2016-06-08 24 views
5

Şu anda boş olan bir veri çerçevesi sütununun (Age) hücre değerlerini değiştirmek istiyorum ve yalnızca başka bir sütun (Survived) karşılık gelen satır için 0 değerine sahipse bunu yapmak istiyorum Yaş için boş yer. Hayatta kalan sütunda 1, ancak Yaş sütununda boş ise, onu boş olarak tutacağım.Pyspark: cümlede ne zaman birden çok koşul

&& operatörünü kullanmayı denedim, ancak çalışmadı. İşte benim kodum:

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

Herhangi bir öneri nasıl halledilir? Teşekkürler.

Hata Mesajı: Python hiçbir && operatörü çünkü

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

cevap

22

Sen SyntaxError hata istisna olsun. and ve & vardır; buradaki sonuncusu, Column (mantıksal bir ayrıştırma için | ve mantıksal negatifleştirme için ~) üzerinde boolean ifadeler oluşturmak için doğru seçimdir.

Oluşturduğunuz koşul, aynı zamanda, operator precedence dikkate alınmadığı için geçersizdir. Python'daki &, =='dan daha yüksek bir önceliğe sahiptir, bu nedenle ifadenin parantez içinde olması gerekir.

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

when fonksiyonu case ifadesi değildir WHEN madde eşdeğerdir. Yine aynı kurallar geçerlidir. Bağlaç:

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

disjunction: Elbette ayrı ayrı parantez önlemek için şartları tanımlarsanız

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

:

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

cond1 & cond2 
-1

Olmalıdır:

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