PySpark pandas中apply调用replace无法移除DataFrame双引号问题
问题原因
代码不生效是两个核心问题:
- 替换目标写错:你代码中待替换的是HTML转义字符
",如果数据里存的是原生半角双引号",这个匹配规则从一开始就找不到目标。 apply用法错误:设置axis=1时,传入自定义函数的参数是整行的Series对象,不是单个单元格值。直接对行Series调用replace默认是整值精确匹配,只有单元格内容完全等于待替换字符串时才会触发替换,子串级的替换根本不会执行——这也是为什么你测试追加字符串能生效(对整行每个值做拼接是逐元素操作),但replace逻辑不生效的原因。
可行解决方案
方案1:全表逐元素替换(推荐,性能最优)
不需要自定义行级apply,直接用逐元素映射的接口处理所有字符串单元格,比行apply性能高很多:
import pyspark.pandas as ps newDf = df.applymap(lambda val: val.replace('"', '') if isinstance(val, str) else val)
如果你的数据里确实存的是"转义字符串,把replace的第一个参数换回"即可
方案2:修正行级apply的逻辑
如果一定要用axis=1的行apply写法,需要在函数内对行的每个单元格单独做字符串替换:
def removeDoubleQuotes(row): return row.apply(lambda cell: cell.replace('"', '') if isinstance(cell, str) else cell) newDf = df.apply(removeDoubleQuotes, axis=1)
方案3:读CSV阶段提前处理(性能最好)
如果双引号是CSV用来包裹字段的标准包裹符,根本不需要读完再替换,读文件时加个参数就能自动解析掉:
df = ps.read_csv("你的csv文件路径.csv", quote='"')
注意:如果双引号是字段内容本身的一部分、不是CSV规范里的字段包裹符,不要用这个方案,选前两种读后替换的方式即可。
内容的提问来源于stack exchange,提问作者user19280047
相关产品推荐
相关产品推荐

