web-dev-qa-db-ja.com

PySpark:when句の複数の条件

現在空白のデータフレーム列(Age)のセル値を変更したいのですが、Ageの空白の対応する行の別の列(Survived)の値が0の場合にのみ行います。 Survived列が1で、Age列が空白の場合、nullのままにします。

&&演算子を使用しようとしましたが、機能しませんでした。ここに私のコードがあります:

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

それを処理する方法はありますか?ありがとう。

エラーメッセージ:

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

Pythonには&&演算子がないため、SyntaxErrorエラー例外が発生します。 and&があり、後者はColumn(論理和の場合は|、論理否定の場合は~にブール式を作成するための正しい選択です。 )。

作成した条件も 演算子の優先順位 を考慮しないため無効です。 Pythonの&==よりも優先度が高いため、式を括弧で囲む必要があります。

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

補足として、when関数はcase句ではなくWHEN式と同等です。それでも同じルールが適用されます。接続詞:

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

選言:

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

もちろん、括弧を避けるために条件を個別に定義できます:

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

cond1 & cond2
75
zero323

少なくともpyspark 2.4で動作するはずです

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

wheninpyspark複数の条件は(for and)を使用して構築できますおよび|(forまたは)。

注:pysparktは、条件を形成するために結合する括弧()内のすべての式を囲むことが重要です

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

Spark Scala code(&&)または(||)条件でwhen関数内で使用される

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

このコードスニペットは、 sparkbyexamples.com からコピーされます

0
vj sreenivasan