You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:17:25