如何让Pandas的str.contains()匹配完整字符串而非子串?
解决Pandas DataFrame精准匹配完整字符串(非子串)的问题
场景1:匹配单元格内容完全等于目标字符串
如果需要筛选**整个单元格内容恰好是"well"**的行,直接用等值比较结合any(axis=1)即可,支持忽略大小写:
import pandas as pd data = [['tom', 'wells fargo', 'retired'], ['nick', 'bank of america', 'partner'], ['juli', 'chase', 'director - oil well'], ['lisa', 'well', 'manager']] df = pd.DataFrame(data, columns=['Name', 'Place', 'Position']) val = 'well' # 严格匹配单元格完整内容(区分大小写) result = df.loc[(df == val).any(axis=1)] # 忽略大小写的版本 result = df.loc[(df.apply(lambda col: col.str.lower()) == val.lower()).any(axis=1)] print(result)
场景2:匹配单元格中包含独立的目标单词(排除子串)
如果需要筛选单元格中包含独立的"well"单词(比如"oil well"中的well,排除"wells"这类子串匹配),可以用正则单词边界\b配合str.contains():
val = 'well' # 用\b确保匹配独立单词,case=False忽略大小写 result = df.loc[df.apply(lambda col: col.str.contains(r'\b' + val + r'\b', case=False)).any(axis=1)] print(result)
这段代码会返回Position列含"oil well"的行,但不会返回Place列是"wells fargo"的行,符合精准匹配非子串的需求。
原代码问题说明
原代码使用str.contains(val)会匹配所有包含该子串的内容,比如"wells"中的"well"子串也会被命中,而上述两种方法分别针对「完整单元格匹配」和「独立单词匹配」实现了精准筛选。
内容的提问来源于stack exchange,提问作者desert_ranger
相关产品推荐
相关产品推荐

