我正在尝试在pyspark数据框中创建一个新列。我有以下数据
+------+
|letter|
+------+
| A|
| C|
| A|
| Z|
| E|
+------+
我想根据
在给定的列的基础上添加新列+------+-----+
|letter|group|
+------+-----+
| A| c1|
| B| c1|
| F| c2|
| G| c2|
| I| c3|
+------+-----+
可以有多个类别,其中有许多字母的单个值(大约100个,也包含多个字母)
我已经使用udf做到了这一点,并且运行良好
from pyspark.sql.functions import udf
from pyspark.sql.types import *
c1 = ['A','B','C','D']
c2 = ['E','F','G','H']
c3 = ['I','J','K','L']
...
def l2c(value):
if value in c1: return 'c1'
elif value in c2: return 'c2'
elif value in c3: return 'c3'
else: return "na"
udf_l2c = udf(l2c, StringType())
data_with_category = data.withColumn("group", udf_l2c("letter"))
现在,我正在尝试不使用udf
的情况。也许使用when
和col
。我尝试了以下。它正在工作,但是代码很长。
data_with_category = data.withColumn('group', when(col('letter') == 'A' ,'c1')
.when(col('letter') == 'B', 'c1')
.when(col('letter') == 'F', 'c2')
...
当条件为字母的所有可能值时,我不太会写new。在我的情况下,字母的数量可能非常大(大约100个)。所以我尝试了
data_with_category = data.withColumn('group', when(col('letter') in ['A','B','C','D'] ,'c1')
.when(col('letter') in ['E','F','G','H'], 'c2')
.when(col('letter') in ['I','J','K','L'], 'c3')
但是它返回错误。我该如何解决?
答案 0 :(得分:4)
使用isin。
c1 = ['A','B','C','D']
c2 =['E','F','G','H']
c3 =['I','J','K','L']
df.withColumn("group", F.when(F.col("letter").isin(c1),F.lit('c1'))\
.when(F.col("letter").isin(c2),F.lit('c2'))\
.when(F.col("letter").isin(c3),F.lit('c3'))).show()
#+------+-----+
#|letter|group|
#+------+-----+
#| A| c1|
#| B| c1|
#| F| c2|
#| G| c2|
#| I| c3|
#+------+-----+
答案 1 :(得分:1)
您可以尝试使用udf, 例如:
say_hello_udf = udf(lambda name: say_hello(name), StringType())
df = spark.createDataFrame([("Rick,"),("Morty,")], ["name"])
df.withColumn("greetings", say_hello_udf(col("name")).show()
或
@udf(returnType=StringType())
def say_hello(name):
return f"Hello {name}"
df.withColumn("greetings", say_hello(col("name")).show()