pandas DataFrame列特殊字符用replace无法移除的解决办法
问题根源
replace()替换失效是两个写法错误导致的:
- pandas Series自带的
replace()默认是单元格全值精确匹配,不是子串匹配。直接传入"'"时,只会替换内容完全等于单引号的单元格,不会处理单元格文本里内嵌的单引号。 - 正则写法不符合pandas规则:一是正则外层多写了
/分隔符(这是JavaScript等语言的正则标记方式,Python正则不需要加前后斜杠);二是没有开启正则匹配参数,pandas默认不会把传入的字符串当做正则表达式解析。
正确写法
所有针对单元格内文本内容的替换操作,都需要先通过.str访问器调用pandas的字符串处理接口,再执行替换,分两种常用场景:
批量清除所有非字母、非空格的特殊字符
适配最初想批量移除'、.、,等特殊符号的需求,直接用正则匹配即可:
df["column_name"] = df["column_name"].str.replace(r"[^a-zA-Z\s]", "", regex=True)
执行后示例数据里的joe's会被处理为joes,所有不在字母、空格范围内的特殊字符都会被清空。
精准移除指定特殊字符
如果只需要清除'、.、,这几个特定符号,不需要过滤其他特殊字符,可以直接匹配指定字符集:
# 仅移除单引号、英文句号、英文逗号 df["column_name"] = df["column_name"].str.replace(r"['.,]", "", regex=True)
如果只需要删除单引号,甚至不需要开正则,直接写:
df["column_name"] = df["column_name"].str.replace("'", "")
验证结果
用提供的测试数据执行上述正确代码,最终输出如下:
id column_name 0 aaa sam 1 bbb joes
单引号会被正常移除,不会出现替换无效果的问题。
注意:不要混淆pandas的
Series.replace()和Python原生字符串的replace():前者默认匹配整个单元格的完整值,后者才是匹配字符串内的子串。只要是处理单元格内部的文本内容,都要先加.str访问器调用字符串专属方法。
内容的提问来源于stack exchange,提问作者Tara
相关产品推荐
相关产品推荐

