J'aimerais modifier les valeurs de cellule d'une colonne de structure de données (Age) où elle est actuellement vide et que je ne le ferais que si une autre colonne (survivant) a la valeur 0 pour la ligne correspondante où elle est vide pour l'âge. S'il est 1 dans la colonne Survived mais vide dans la colonne Age, je le garderai comme nul.
J'ai essayé d'utiliser &&
_ opérateur mais cela n'a pas fonctionné. Voici mon code:
tdata.withColumn("Age", when((tdata.Age == "" && tdata.Survived == "0"), mean_age_0).otherwise(tdata.Age)).show()
Des suggestions comment gérer cela? Merci.
Message d'erreur:
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()
^
Vous obtenez une exception d'erreur SyntaxError
parce que Python n'a pas de &&
_ opérateur. Il a and
et &
où ce dernier est le bon choix pour créer des expressions booléennes sur Column
(|
pour une disjonction logique et ~
pour la négation logique).
La condition que vous avez créée est également invalide car elle ne prend pas en compte priorité de l'opérateur . &
in Python a une priorité plus élevée que ==
donc l'expression doit être mise entre parenthèses.
(col("Age") == "") & (col("Survived") == "0")
## Column<b'((Age = ) AND (Survived = 0))'>
Sur une note, la fonction when
équivaut à la phrase case
et non à la clause WHEN
. Toujours les mêmes règles s'appliquent. Conjonction:
df.where((col("foo") > 0) & (col("bar") < 0))
Disjonction:
df.where((col("foo") > 0) | (col("bar") < 0))
Vous pouvez bien sûr définir les conditions séparément pour éviter les parenthèses:
cond1 = col("Age") == ""
cond2 = col("Survived") == "0"
cond1 & cond2
cela devrait fonctionner au moins dans pyspark 2.4
tdata = tdata.withColumn("Age", when((tdata.Age == "") & (tdata.Survived == "0") , "NewValue").otherwise(tdata.Age))
quand dans pyspark plusieurs conditions peuvent être construites avec & (pour et) et | (pour ou).
Remarque: Dans pyspark Il est important de placer toutes les expressions entre parenthèses () qui se combinent pour former la condition.
%pyspark
dataDF = spark.createDataFrame([(66, "a", "4"),
(67, "a", "0"),
(70, "b", "4"),
(71, "d", "4")],
("id", "code", "amt"))
dataDF.withColumn("new_column",
when((col("code") == "a") | (col("code") == "d"), "A")
.when((col("code") == "b") & (col("amt") == "4"), "B")
.otherwise("A1")).show()
Dans les conditions Spark Scala ( &&) ou ||) être utilisé dans quand fonction
//scala
val dataDF = Seq(
(66, "a", "4"), (67, "a", "0"), (70, "b", "4"), (71, "d", "4"
)).toDF("id", "code", "amt")
dataDF.withColumn("new_column",
when(col("code") === "a" || col("code") === "d", "A")
.when(col("code") === "b" && col("amt") === "4", "B")
.otherwise("A1")).show()
========================
Output:
+---+----+---+----------+
| id|code|amt|new_column|
+---+----+---+----------+
| 66| a| 4| A|
| 67| a| 0| A|
| 70| b| 4| B|
| 71| d| 4| A|
+---+----+---+----------+
Cet extrait de code est copié à partir de sparkbyexamples.com