我有一个要求,即在PySpark数据框中必须有一堆电子邮件,姓名和其他客户信息。我的所有电子邮件字段都被屏蔽,除了一个字段外,我想在我生成的新列中获取该字段的名称。
{
title: 'First',
content: '<Autocomplete />',
},
我知道上面的代码覆盖了我正在创建的新字段,并且只是获取了数据框中的最后一个列名,所以我不确定如何正确地执行操作。
def add_base_col(df):
for name in df.schema.names:
df1 = df.withColumn("is_base", F.when(df[name].like("%*%"), None).otherwise(name))
return df1
我发现的另一种方法是这种方法,但也没有帮助我
Name Email1 Email2 Email3 Email4 Phone is_base
ABC abc@g.com a**@g.com x*@edu.com za**@fgh.com 123459684 Email1
XYZ xy**@c.com mkfg@bc.com s**@sflh.edu hgu**@j.com 237623747 Email2
答案 0 :(得分:1)
如果您确定每行最多未屏蔽一封电子邮件,则可以使用数组,然后使用EMPTY连接数组项:
from pyspark.sql.functions import when, array, concat_ws, col
cols = [ c for c in df.columns if c.startswith('Email')]
df.withColumn('is_base', concat_ws('', array([ when(~col(c).rlike('\*'), c) for c in cols]))).show()
+----+----------+-----------+------------+------------+---------+-------+
|Name| Email1| Email2| Email3| Email4| Phone|is_base|
+----+----------+-----------+------------+------------+---------+-------+
| ABC| abc@g.com| a**@g.com| x*@edu.com|za**@fgh.com|123459684| Email1|
| XYZ|xy**@c.com|mkfg@bc.com|s**@sflh.edu| hgu**@j.com|237623747| Email2|
+----+----------+-----------+------------+------------+---------+-------+