在Pyspark 2中,基于多个条件添加列

在Pyspark 2中,基于多个条件添加列,pyspark,Pyspark,我想根据条件添加一列。我有一个关于'E\u Ref\u value'的值,但我想添加一个关于E\u Ref\u value列的列,作为E\u Ref\u Grp。 下面是我运行的代码 df=df.withColumn('E_Ref_Grp',f.when((col("E_Ref_Value")>0 & f.col("E_Ref_Value")<31), f.lit(1))\ .wh

我想根据条件添加一列。我有一个关于
'E\u Ref\u value'
的值,但我想添加一个关于
E\u Ref\u value
列的列,作为
E\u Ref\u Grp
。 下面是我运行的代码

df=df.withColumn('E_Ref_Grp',f.when((col("E_Ref_Value")>0 & f.col("E_Ref_Value")<31), f.lit(1))\
                            .when((f.col("E_Ref_Value")>30 & f.col("E_Ref_Value")<61),f.lit(2)))

您需要将每个比较都写在括号中。
col(“E\u Ref\u Value”)>0
变成
(col(“E\u Ref\u Value”)>0)
,等等

df = df.withColumn(
    "E_Ref_Grp",
    when(((col("E_Ref_Value") > 0) & (col("E_Ref_Value") < 31)), lit(1)).when(
        ((col("E_Ref_Value") > 30) & (col("E_Ref_Value") < 61)), lit(2)
    ),
)
df=df.withColumn(
“E_Ref_Grp”,
当((列(“E_参考值”)>0)和(列(“E_参考值”)<31)时,点亮(1)。当(
((col(“E_参考值”)>30)和(col(“E_参考值”)<61)),lit(2)
),
)

您缺少
,否则
一起时

# create data frame
df = spark.createDataFrame(
[("1","358934","2020"),
("2","38639","2021"),
("21","7675","2026"),
("30","983434","2022"),
("31","234","2023"),
("60","2325","2024"),
("61","4545","2025")], 
("E_Ref_Value","projection","year"))

# show contents of data frame
df.show()
+-----------+----------+----+
|E_Ref_Value|projection|year|
+-----------+----------+----+
|          1|    358934|2020|
|          2|     38639|2021|
|         21|      7675|2026|
|         30|    983434|2022|
|         31|       234|2023|
|         60|      2325|2024|
|         61|      4545|2025|
+-----------+----------+----+

# import necessary functions
import pyspark.sql.functions as f

# apply when otherwise
df1 = df.withColumn("E_Ref_Grp", f.when(((f.col("E_Ref_Value") > 0) & (f.col("E_Ref_Value") < 31)), f.lit(1)). when(((f.col("E_Ref_Value") > 30) & (f.col("E_Ref_Value") < 61)), f.lit(2)).otherwise(f.lit(None)))

# display df1 result
df1.show()
+-----------+----------+----+---------+
|E_Ref_Value|projection|year|E_Ref_Grp|
+-----------+----------+----+---------+
|          1|    358934|2020|        1|
|          2|     38639|2021|        1|
|         21|      7675|2026|        1|
|         30|    983434|2022|        1|
|         31|       234|2023|        2|
|         60|      2325|2024|        2|
|         61|      4545|2025|     null|
+-----------+----------+----+---------+
#创建数据帧
df=spark.createDataFrame(
[("1","358934","2020"),
("2","38639","2021"),
("21","7675","2026"),
("30","983434","2022"),
("31","234","2023"),
("60","2325","2024"),
("61","4545","2025")], 
(“E_参考值”、“预测”、“年份”))
#显示数据框的内容
df.show()
+-----------+----------+----+
|E|u参考值|预测|年|
+-----------+----------+----+
|          1|    358934|2020|
|          2|     38639|2021|
|         21|      7675|2026|
|         30|    983434|2022|
|         31|       234|2023|
|         60|      2325|2024|
|         61|      4545|2025|
+-----------+----------+----+
#导入必要的功能
导入pyspark.sql.f函数
#否则适用
df1=df.带列(“E_Ref_Grp”,f.when((f.col(“E_Ref_值”)>0)和(f.col(“E_Ref_值”)<31)),f.lit(1))。当((f.col(“E_Ref_值”)>30和(f.col(“E_Ref_值”)<61))时,f.lit(2))。否则(f.lit(无))
#显示df1结果
df1.show()
+-----------+----------+----+---------+
|E|u参考值|预测|年份| E|u参考值| Grp|
+-----------+----------+----+---------+
|          1|    358934|2020|        1|
|          2|     38639|2021|        1|
|         21|      7675|2026|        1|
|         30|    983434|2022|        1|
|         31|       234|2023|        2|
|         60|      2325|2024|        2|
|61 | 4545 | 2025 |零|
+-----------+----------+----+---------+

也许您可以单独将条件分解为布尔值,并使用它们创建所需的列

下面是我的意思的一个例子-

df = spark.createDataFrame([0.0,10.0,100.0,32.0,45.0], FloatType())

df = df.withColumn("Cond1_Bool",(F.col("value") > 0) & (F.col("value") < 31))
df = df.withColumn("Cond2_Bool",(F.col("value") > 30) & (F.col("value") < 61))

df = df.withColumn("E_Ref_Grp",F.when(F.col("Cond1_Bool"),F.lit(1)).otherwise(F.lit(2)))

df.show()

+-----+----------+----------+---------+
|value|Cond1_Bool|Cond2_Bool|E_Ref_Grp|
+-----+----------+----------+---------+
|  0.0|     false|     false|        1|
| 10.0|      true|     false|        1|
|100.0|     false|     false|        1|
| 32.0|     false|      true|        2|
| 45.0|     false|      true|        2|
+-----+----------+----------+---------+

df=spark.createDataFrame([0.0,10.0100.0,32.0,45.0],FloatType())
df=带列的df(“Cond1_Bool”),(F.col(“值”)>0)和(F.col(“值”)<31))
df=带列的df(“Cond2_Bool”),(F.col(“值”)>30)和(F.col(“值”)<61))
df=带列的df(“E_Ref_Grp”,F.when(F.col(“Cond1_Bool”),F.lit(1))。否则(F.lit(2)))
df.show()
+-----+----------+----------+---------+
|值| Cond1_Bool | Cond2_Bool | E|u Ref_Grp|
+-----+----------+----------+---------+
|0.0 |假|假| 1|
|10.0 |正确|错误| 1|
|100.0 |假|假| 1|
|32.0 |假|真| 2|
|45.0 |假|真| 2|
+-----+----------+----------+---------+

您可以在之后删除额外的列

我尝试了此解决方案,但得到了相同的错误。在错误消息中,没有特定的错误代码。@EfeTürkoğlu我编辑了消息,添加了更多详细信息。你需要把每个比较放在括号里。这就是你所做的吗?我也尝试了新版本,但仍然没有解决。如果你不添加错误,我们可能无法帮助我添加错误消息OK。和我的解决方案的错误消息?因为我的解决方案解决了这个问题。我已经编辑并添加了应用您建议的解决方案后收到的错误消息。我仍然会收到相同的错误消息和一个错误消息,还有一个错误是IllegalArgumentException:“when()只能应用于when()函数以前生成的列”。这次我得到了错误代码atleast@EfeTürkoğlu为先前共享的代码块添加了演示。它正在按预期工作是的,谢谢。我理解这个问题。在第一个when函数中,我使用了f.when,但当我再次使用when函数添加一个新条件时,我之前也添加了f。这就是我出错的原因。
df = spark.createDataFrame([0.0,10.0,100.0,32.0,45.0], FloatType())

df = df.withColumn("Cond1_Bool",(F.col("value") > 0) & (F.col("value") < 31))
df = df.withColumn("Cond2_Bool",(F.col("value") > 30) & (F.col("value") < 61))

df = df.withColumn("E_Ref_Grp",F.when(F.col("Cond1_Bool"),F.lit(1)).otherwise(F.lit(2)))

df.show()

+-----+----------+----------+---------+
|value|Cond1_Bool|Cond2_Bool|E_Ref_Grp|
+-----+----------+----------+---------+
|  0.0|     false|     false|        1|
| 10.0|      true|     false|        1|
|100.0|     false|     false|        1|
| 32.0|     false|      true|        2|
| 45.0|     false|      true|        2|
+-----+----------+----------+---------+