我正在嘗試F.when基于可變數量的條件構建一系列。如何使用回圈構建下面的邏輯,在其中我提供要測驗的專案串列(即[1,2,3]按照下面的示例)?
我問的原因是因為我希望能夠使用串列中可變數量的測驗項來構建這些條件[1,2,3]。
F.when(F.col("test") == 1, "out_" str(1) ).when(F.col("test") == 2, "out_" str(2)).when(F.col("test") == 3, "out_" str(3)).otherwise(-1)
我試過用reduce這個來做,但以前沒有弄清楚。有人有建議嗎?
reduce(lambda x, i: x.when(F.col("test") == i , "out_" str(i)),
output_df,
F).otherwise(-1)
我的預期輸出應提供與以下相同的邏輯:
Column<b'CASE WHEN (test = 1) THEN out_1 WHEN (test = 2) THEN out_2 WHEN (test = 3) THEN out_3 ELSE -1 END'>
uj5u.com熱心網友回復:
你差不多明白了,你需要將測驗用例串列作為第二個引數傳遞給reduce函式:
from functools import reduce
import pyspark.sql.functions as F
tests = [1, 2, 3]
new_col = reduce(
lambda x, i: x.when(F.col("test") == i, "out_" str(i)),
tests,
F
).otherwise(-1)
print(new_col)
#Column<'CASE WHEN (test = 1) THEN out_1 WHEN (test = 2) THEN out_2 WHEN (test = 3) THEN out_3 ELSE -1 END'>
uj5u.com熱心網友回復:
由于您的支票與您的輸出具有相同的價值,但附加了out_. 您可以檢查該值是否在預定義串列中,以及它是否只是 add out_。
例子:
from pyspark.sql import SparkSession
import pyspark.sql.functions as F
data = [
{"test": 1},
{"test": 2},
{"test": 3},
{"test": 4},
{"test": 5},
]
test_ints = [1, 2, 3]
spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame(data)
df = df.withColumn(
"result",
F.when(
F.col("test").isin(test_ints),
F.concat(F.lit("out_"), F.col("test")),
).otherwise(-1),
)
結果:
---- ------
|test|result|
---- ------
|1 |out_1 |
|2 |out_2 |
|3 |out_3 |
|4 |-1 |
|5 |-1 |
---- ------
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/383935.html
