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