wake-up-neo.com

PySpark: Mehrere Bedingungen in der when-Klausel

Ich möchte die Zellenwerte einer DataFrame-Spalte (Age) ändern, in der sie derzeit leer ist, und ich würde dies nur tun, wenn eine andere Spalte (Survived) den Wert 0 für die entsprechende Zeile hat, in der sie für Age leer ist. Wenn in der Spalte "Überlebt" 1, in der Spalte "Alter" jedoch leer ist, wird der Wert "Null" beibehalten.

Ich habe versucht, && Operator, 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()
                                                    ^
28
sjishan

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

Die von Ihnen erstellte Bedingung ist ebenfalls ungültig, da sie Operatorrangfolge nicht berücksichtigt. & in Python hat eine höhere Priorität als == Der Ausdruck muss daher in Klammern gesetzt werden.

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

Nebenbei bemerkt entspricht die Funktion when der Klausel case expression not WHEN. Es gelten immer noch die gleichen Regeln. Verbindung:

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

Disjunktion:

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

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

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

cond1 & cond2
75
zero323

es sollte zumindest in pyspark 2.4 funktionieren

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

wenn in Pyspark mehrere Bedingungen erstellt werden können mit & (für und) und | (für oder).

Hinweis: In pyspark ist es wichtig, alle Ausdrücke in Klammern () einzuschließen, die zusammen die Bedingung bilden

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

In Spark Scala code ( && ) oder ( || ) Bedingungen können innerhalb von verwendet werden, wenn funktioniert

//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|
+---+----+---+----------+

Dieser Codeausschnitt wird von sparkbyexamples.com kopiert

0
vj sreenivasan