比较两列以在Spark DataFram中创建新列

2024-06-30 15:27:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Spark数据框,它有两列,我试图用when-otherwise操作创建一个新列。

df_newcol = df.withColumn("Flag", when(col("a") <= lit(ratio1) | col("b") <= lit(ratio1), 1).otherwise(2))

但这是个错误

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

我以前用过when和otherwise来处理一个列,而用它来处理多个列时,我们必须用不同的方式来编写逻辑。

谢谢。


Tags: 数据dffor错误colsparkflagwhen
1条回答
网友
1楼 · 发布于 2024-06-30 15:27:11

您有一个运算符优先权问题,当比较与逻辑运算符(如&|)混合时,请确保将比较运算符放在括号中,如果使用逻辑运算符(如&|),则您甚至不需要lit,标量也应该可以工作:

import pyspark.sql.functions as F
df = spark.createDataFrame([[1, 2], [2, 3], [3, 4]], ['a', 'b'])

以下两项都应有效:

df.withColumn('flag', F.when((F.col("a") <= F.lit(2)) | (F.col("b") <= F.lit(2)), 1).otherwise(2)).show()
+---+---+----+
|  a|  b|flag|
+---+---+----+
|  1|  2|   1|
|  2|  3|   1|
|  3|  4|   2|
+---+---+----+

df.withColumn('flag', F.when((F.col("a") <= 2) | (F.col("b") <= 2), 1).otherwise(2)).show()
+---+---+----+
|  a|  b|flag|
+---+---+----+
|  1|  2|   1|
|  2|  3|   1|
|  3|  4|   2|
+---+---+----+

相关问题 更多 >