如何从列名为UUID的PySpark DataFrame提取每行唯一非空值到新列
解决方案
针对你遇到的PySpark DataFrame列名为UUID、每行仅一个非空值的场景,有两种简洁的方法可以提取唯一非空值到新列:
方法一:使用coalesce函数
coalesce会返回传入参数中的第一个非空值,正好适配你每行仅一个非空值的情况,而且可以通过df.columns动态获取所有列,无需硬编码UUID列名:
from pyspark.sql.functions import coalesce, col # 动态生成所有列的col对象列表 all_columns = [col(col_name) for col_name in df.columns] # 添加新列,提取唯一非空值 df = df.withColumn("new_column", coalesce(*all_columns))
方法二:使用array+filter+element_at组合
如果想更直观地过滤空值后提取,可以先把所有列转为数组,过滤掉null元素,再取数组的第一个元素:
from pyspark.sql.functions import array, filter, element_at df = df.withColumn( "new_column", element_at( filter(array(*[col(col_name) for col_name in df.columns]), lambda x: x.isNotNull()), 1 ) )
两种方法都不需要依赖具体的列名,完全适配UUID生成的动态列名场景,且因为每行仅一个非空值,最终结果一致。
内容的提问来源于stack exchange,提问作者pscodes
相关产品推荐
相关产品推荐

