如何用PySpark正确去除DataFrame列中的'(gen. comb.)'子串?
PySpark移除指定子串的问题与解决方法
问题场景
你的DataFrame列column1原始数据:
df1["column1"] = ["Temp 1 (gen. comb.)", "Temp 1", "Temp 2 (gen. comb.)", "Temp 2","Temp 3 (gen. comb.)", "Temp 3"]
你尝试用PySpark代码移除(gen. comb.)子串:
import pyspark.sql.functions as F result_df = res.withColumn('c_model_detail', F.regexp_replace('column1', '(gen. comb.)', ''))
但处理后列中残留括号,结果为:
result_df["column1"] = ["Temp 1 ()", "Temp 1", "Temp 2 ()", "Temp 2","Temp 3 ()", "Temp 3"]
而你在pandas中用以下代码可正常实现需求:
result_df["column1"] = df["column1"].str.replace(" (gen. comb.)","",regex=False)
错误原因
你使用的regexp_replace是基于正则表达式的替换函数,而(gen. comb.)中的括号()和点.都是正则特殊字符:
()在正则中代表捕获组,并非字面意义的括号;.在正则中代表匹配任意单个字符,并非字面意义的点。
原代码仅替换了gen. comb.部分(且.的匹配逻辑不符合预期),未处理前后的括号,因此残留了()。
正确的PySpark实现方法
方法1:正则表达式转义特殊字符
手动转义特殊字符,或用re.escape()自动转义,确保匹配字面字符串:
import pyspark.sql.functions as F # 手动转义,同时匹配前面的空格避免残留空格 result_df = res.withColumn('c_model_detail', F.regexp_replace('column1', r' \(gen\. comb\.\)', '')) # 或用re.escape自动转义(需导入re模块) import re target_str = ' (gen. comb.)' result_df = res.withColumn('c_model_detail', F.regexp_replace('column1', re.escape(target_str), ''))
方法2:非正则字符串替换(Spark 3.4+)
Spark 3.4及以上版本提供了string_replace函数,和pandasstr.replace(regex=False)逻辑一致,直接替换字面字符串,无需处理正则特殊字符:
import pyspark.sql.functions as F result_df = res.withColumn('c_model_detail', F.string_replace('column1', ' (gen. comb.)', ''))
内容的提问来源于stack exchange,提问作者ar_mm18
相关产品推荐
相关产品推荐

