迭代Pyspark dataframe的列,并根据条件填充新列

迭代Pyspark dataframe的列,并根据条件填充新列,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,我有一个要求,在PySpark数据框中有一堆电子邮件、姓名和其他客户信息。我的所有电子邮件字段都被屏蔽,只有一个除外,我想在我生成的新列中获取该字段的名称 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 我知道上面的代码重

我有一个要求,在PySpark数据框中有一堆电子邮件、姓名和其他客户信息。我的所有电子邮件字段都被屏蔽,只有一个除外,我想在我生成的新列中获取该字段的名称

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
我知道上面的代码重写了我正在创建的新字段,只得到了dataframe中的最后一个列名,所以我不确定如何正确执行

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

我发现的另一种方法是这样的,但对我也没有帮助

df.withColumn("is_base", 
    F.coalesce(*[F.when(~F.col(c).like('%*%'), c) for c in df.columns])
).show()

如果您确定每行最多有一封电子邮件未屏蔽,则可以使用array,然后将array项标记为空:

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