You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataFrame中批量移除末尾指定地名(排除of/in前置)报错求助

解决方案:用正则表达式实现精准匹配替换

你的报错是因为removesuffix()仅支持单个字符串参数,无法处理列表,而且它也做不到前置条件的判断(排除"of"/"in"开头的情况)。针对多词地名的需求,用正则表达式的负向预查可以完美解决,而且处理大数据量的速度远快于STATA。

具体步骤与代码

  1. 准备数据与地名列表
    先定义示例DataFrame和需要处理的地名列表(包含多词地名):

    import pandas as pd
    import re
    
    # 示例数据
    df = pd.DataFrame({
        'company_name': [
            'KFC liverpool',
            'Taxis in Liverpool',
            'ABC West Essex',
            'XYZ of West Essex',
            'London Foods',
            'Cafe in London'
        ]
    })
    
    # 指定需要移除的地名列表
    place_names = ['Liverpool', 'West Essex', 'London']
    
  2. 排序地名列表
    按地名长度从长到短排序,避免短地名优先匹配(比如先匹配"West Essex"而不是"Essex",如果列表里同时存在的话):

    place_names_sorted = sorted(place_names, key=lambda x: len(x), reverse=True)
    
  3. 构建正则匹配模式
    核心是用负向零宽断言排除地名前是"of "或"in "的情况,同时匹配字符串末尾的地名:

    # 转义地名中的特殊字符,避免正则语法冲突
    escaped_places = [re.escape(place) for place in place_names_sorted]
    # 构建正则:(?<!(of|in) ) 确保前面不是of/in加空格;$ 确保地名在末尾
    pattern = r'(?<!(of|in) )(' + '|'.join(escaped_places) + r')$'
    
  4. 执行清洗并处理结果
    用str.replace()批量替换,再用strip()去除替换后可能残留的末尾空格:

    # 可选添加flags=re.IGNORECASE实现大小写不敏感匹配
    df['cleaned_name'] = df['company_name'].str.replace(pattern, '', regex=True).str.strip()
    

最终效果

处理后的cleaned_name列结果如下:

company_namecleaned_name
KFC liverpoolKFC
Taxis in LiverpoolTaxis in Liverpool
ABC West EssexABC
XYZ of West EssexXYZ of West Essex
London FoodsLondon Foods
Cafe in LondonCafe in London

完全符合需求:仅移除末尾且前面不是"of"/"in"的地名,同时正确处理多词地名。

内容的提问来源于stack exchange,提问作者gol.mat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:39:15