pandas的str.contains在关键词与特殊字符无空格时失效,如何简化处理?
解决方案
你不需要创建和删除临时字段,也无需提前删除括号,之前匹配失败的核心原因是你写的正则模式里给Episode后加了强制空格,导致(Episode这类关键词前接括号、无空格的场景无法命中,直接调整匹配规则即可:
import pandas as pd import numpy as np watched_df = pd.DataFrame([['Love Death Robots (Episode 1)'], ['James Bond'], ['How I met your Mother (Avnsitt 3)'], ['random name'], ['Random movie 3 Episode 8383893']], columns=['Title']) # 直接在原Title列匹配,无需中间字段 watched_df["Film_Type"] = np.where( watched_df['Title'].str.contains(r'Episode|Avnsitt', case=False), 'Series', 'Movie' ) print(watched_df)
如果要避免匹配到把Episode/Avnsitt作为子串的其他单词(比如出现Episodexyz这类不需要命中的内容),可以给模式加单词边界限定,改为r'\b(Episode|Avnsitt)\b',无论关键词前后是括号、空格、标点都可以正确识别为独立单词。
关于类SQL LIKE功能的疑问:pandas.Series.str.contains()本身就是和SQL LIKE完全对应的函数,甚至支持正则,灵活性更高:
- 等价于SQL
title LIKE '%Episode%' OR title LIKE '%Avnsitt%'的效果,直接用上述代码即可实现 - 如果你不需要正则能力,担心特殊字符被识别为正则元字符,可以加参数
regex=False,多关键词可以通过逻辑或组合:cond = watched_df['Title'].str.contains('Episode', case=False, regex=False) | watched_df['Title'].str.contains('Avnsitt', case=False, regex=False) watched_df["Film_Type"] = np.where(cond, 'Series', 'Movie')
内容的提问来源于stack exchange,提问作者Sebastian ten Berge
相关产品推荐
相关产品推荐

