Spark DataFrame遍历列应用regex_replace仅最后一列生效问题解决
批量在Spark DataFrame所有列应用regex_replace的正确方式
你的问题根源在于循环中每次都基于原始DataFrame创建新对象,而非累积之前的修改结果。每次withColumn操作都从初始的df开始,导致前序列的修改被覆盖,最终仅保留最后一列的变更。
解决方案1:累积更新DataFrame
初始化new_df为原始DataFrame,之后每次迭代都基于上一次修改后的new_df进行更新:
from pyspark.sql.functions import regexp_replace names = df.schema.names new_df = df # 从原始DataFrame开始 for name in names: # 基于当前new_df修改列,而非原始df new_df = new_df.withColumn(name, regexp_replace(name, " ", "_")) display(new_df)
解决方案2:使用select+列表推导式(更简洁的Spark风格)
利用Spark的函数式API,通过列表推导式一次性生成所有列的转换逻辑,避免循环累积:
from pyspark.sql.functions import regexp_replace, col new_df = df.select( [regexp_replace(col(name), " ", "_").alias(name) for name in df.schema.names] ) display(new_df)
验证结果
两种方法执行后,DataFrame的所有列都会将空格替换为下划线,输出如下:
+-------+-------+ | label1| label2| +-------+-------+ |one_two|foo_foo| |one_two|bar_bar| +-------+-------+
内容的提问来源于stack exchange,提问作者Mrmoleje
相关产品推荐
相关产品推荐

