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