我正在检查DF中6列中的2列的NULL值。但是当我应用内置函数并使用select时,结果DF没有剩余的列。有没有更好的方法可以不使用UDF。
handle_null_cols = [ 'col1', 'col3' ]
# df_null = df.select([ myFunc(col_name).alias(col_name) for col_name in df.columns ])
df_null = df.select( [ myFunc(col_name).alias(col_name) for col_name in handle_null_cols ])
df_null.printSchema() # Resultant DF has only 2 columns selected
col1:int
col3:int
需要重复使用相同的DF df_null
,以便在df
之前的所有列的下游进行更多转换。
答案 0 :(得分:2)
你为什么不做这样的事?
df.select([
myFunc(col_name).alias(col_name) if col_name in handle_null_cols
else col_name
for col_name in df.columns
])
reduce
+ withColumn
是更加神秘但可行的解决方案:
from functools import reduce
reduce(
lambda df, col_name: df.withColumn(col_name, myFunc(col_name)),
handle_null_cols,
df)
但听起来有点像你真正想要na
个功能:
df.na.fill(0, subset=handle_null_cols)
答案 1 :(得分:0)
我想我是基于@ user9613318的见解而弄明白的。 更轻松的眼睛。而且效率也很高?
handle_null_cols = [ 'col1', 'col3' ]
df_null = ( df.select(*[myFunc(col).alias(col)
if col in handle_null_cols else col for col in df.columns]))