Pandas的str.contains()无论regex参数如何都返回错误结果如何解决
问题原因分析
- 第一次全返回True:
str.contains默认开启正则匹配,$是正则里的行尾锚定符,匹配任何字符串的末尾,因此所有非空条目都会返回True。 - 第二次设置
regex=False后全返回False,核心原因是待搜索的$符号和你传入的搜索字符不匹配,常见场景包括:- 字符串中存储的是全角美元符号
$(Unicode编码\uff04),你传入搜索的是半角$(ASCII编码\x24) - 字符串中$前后存在零宽空格、非打印字符,或者你本地输入搜索字符串时误带了不可见字符
- 部分条目为
NaN空值,str.contains默认对空值返回NaN而非布尔值,干扰筛选判断
- 字符串中存储的是全角美元符号
解决方案
第一步:先确认字符编码
取你确认包含$的条目,打印原始编码确认$的类型:
# 取第一个元素打印编码,替换索引为你确定含$的行号即可 print(valid_usa_gross.iloc[0].encode('unicode_escape'))
如果输出中对应$的部分是\\uff04,说明是全角符号,搜索时要对应传入全角$;如果是\\x24就是正常半角$。
第二步:使用正确的匹配写法
如果是半角$,优先用正则转义写法匹配,同时设置空值默认返回False:
valid_usa_gross_USD = valid_usa_gross.str.contains(r'\$', na=False)
如果是全角$,修改匹配字符串即可:
valid_usa_gross_USD = valid_usa_gross.str.contains(r'$', na=False)
第三步:(可选)先清洗字符串再匹配
如果存在多余空白、不可见字符干扰,先做清洗再匹配:
# 先去除首尾空白、再匹配 valid_usa_gross_USD = valid_usa_gross.str.strip().str.contains(r'\$', na=False)
筛选符合条件的条目直接用布尔索引即可:
only_usd = valid_usa_gross[valid_usa_gross_USD]
内容的提问来源于stack exchange,提问作者Nicola
相关产品推荐
相关产品推荐

