python – 当列表值与Pyspark数据帧中的列值的子字符串匹配时,填充新列

我在Pyspark有一个数据框,如下所示

df.show()

+---+----------------------+
| id|                   con|
+---+----------------------+
|  3|           mac,mac pro|
|  1|        iphone5,iphone|
|  1| android,android phone|
|  1|    windows,windows pc|
|  1| spy camera,spy camera|
|  2|               camera,|
|  3|             cctv,cctv|
|  2|   apple iphone,iphone|
|  3|           ,spy camera|
+---+----------------------+

我想基于某些列表创建新列.列表如下

phone_list = ['iphone', 'android', 'nokia']
pc_list = ['windows', 'mac']

条件:

if a element in a list matches a string/substring in a column then flag the column to the value of that particular list

基本上我想要的是在phone_list中我有元素iphone,所以应该匹配id 1,其中con是iphone5,iphone和旗帜作为手机等等.

预期结果

+---+----------------------+------+----+
| id|                   con|   cat| abc|
+---+----------------------+------+----+
|  3|           mac,mac pro|  null|  pc|
|  1|        iphone5,iphone|phones|null|
|  1| android,android phone|phones|null|
|  1|    windows,windows pc|  null|  pc|
|  1| spy camera,spy camera|  null|null|
|  2|               camera,|  null|null|
|  3|             cctv,cctv|  null|null|
|  2|   apple iphone,iphone|phones|null|
|  3|           ,spy camera|  null|null|
+---+----------------------+------+----+

我在下面做了.

df1 = df.withColumn('cat', F.when(df.con.isin(phone_list), 'phones')).withColumn('abc', F.when(df.con.isin(pc_list), 'pc'))

产量

df1.show()

+---+----------------------+----+----+
| id|                   con| cat| abc|
+---+----------------------+----+----+
|  3|           mac,mac pro|null|null|
|  1|        iphone5,iphone|null|null|
|  1| android,android phone|null|null|
|  1|    windows,windows pc|null|null|
|  1| spy camera,spy camera|null|null|
|  2|               camera,|null|null|
|  3|             cctv,cctv|null|null|
|  2|   apple iphone,iphone|null|null|
|  3|           ,spy camera|null|null|
+---+----------------------+----+----+

我怎样才能以正确的方式进行这种比较?

解决方法:

最好的方法是避免使用udf并使用pyspark.sql.Column.rlike().如果列与参数中包含的正则表达式匹配,则返回True.

在这种情况下,您可以使用“|”.join(list_of_terms)创建一个匹配列表中任何单词的正则表达式模式. (“|”是OR运算符)

from pyspark.sql.functions import col, when

df.select(
    "*", 
    when(col("con").rlike("|".join(phone_list)), "phones").alias("cat"), 
    when(col("con").rlike("|".join(pc_list)), "pc").alias("abc")
).show(truncate=False)
#+---+---------------------+------+----+
#|id |con                  |cat   |abc |
#+---+---------------------+------+----+
#|3  |mac,mac pro          |null  |pc  |
#|1  |iphone5,iphone       |phones|null|
#|1  |android,android phone|phones|null|
#|1  |windows,windows pc   |null  |pc  |
#|1  |spy camera,spy camera|null  |null|
#|2  |camera,              |null  |null|
#|3  |cctv,cctv            |null  |null|
#|2  |apple iphone,iphone  |phones|null|
#|3  |,spy camera          |null  |null|
#+---+---------------------+------+----+

我们还使用了如果没有指定otherwise()条件,pyspark.sql.functions.when()将返回null的事实.

上一篇:python – 在PySpark中爆炸


下一篇:python – 在PySpark ML中创建自定义Transformer