如何优雅地在Pandas DataFrame字符串列中检测多个子字符串?
更简洁的Pandas子字符串匹配方案
嘿,这种重复写一堆str.contains的情况确实够烦的!我之前处理公司名称识别的时候也踩过这个坑,给你分享几个更优雅的实现方式:
1. 正则表达式合并关键词(推荐)
利用正则的|操作符把所有后缀合并成一个模式,只需要一次str.contains调用就能搞定,而且提前统一转大写一次就够了,不用重复写:
# 先定义所有需要匹配的公司后缀列表,方便后续维护 company_suffixes = ['LIMITED', 'INC', 'CORP'] # 把列表转成正则匹配模式 pattern = '|'.join(company_suffixes) # 一次完成大写转换+匹配 is_company = df['NAME'].str.upper().str.contains(pattern, regex=True)
如果担心误匹配(比如人名里刚好包含INC这类短后缀的子串),可以加上单词边界\b,确保只匹配完整的后缀单词:
pattern = r'\b(' + '|'.join(company_suffixes) + r')\b' is_company = df['NAME'].str.upper().str.contains(pattern, regex=True)
这种方法是向量化操作,比循环或多次or判断效率高得多,尤其是处理大数据集的时候优势明显。
2. 用apply结合any(适合复杂匹配场景)
如果你的后缀匹配逻辑比较复杂(比如需要额外的条件判断),可以用apply配合生成器表达式:
company_suffixes = ['LIMITED', 'INC', 'CORP'] is_company = df['NAME'].str.upper().apply( lambda name: any(suffix in name for suffix in company_suffixes) )
不过要注意,apply本质是逐行循环,数据量很大的时候性能不如正则方法,所以优先推荐第一种方案。
小提示
把后缀单独放在列表里还有个好处:后续要新增或修改后缀时,只需要修改列表就行,不用动匹配逻辑的代码,维护起来特别方便!
内容的提问来源于stack exchange,提问作者aldorado
相关产品推荐
相关产品推荐

