DataFrame中批量移除末尾指定地名(排除of/in前置)报错求助
解决方案:用正则表达式实现精准匹配替换
你的报错是因为removesuffix()仅支持单个字符串参数,无法处理列表,而且它也做不到前置条件的判断(排除"of"/"in"开头的情况)。针对多词地名的需求,用正则表达式的负向预查可以完美解决,而且处理大数据量的速度远快于STATA。
具体步骤与代码
准备数据与地名列表
先定义示例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']排序地名列表
按地名长度从长到短排序,避免短地名优先匹配(比如先匹配"West Essex"而不是"Essex",如果列表里同时存在的话):place_names_sorted = sorted(place_names, key=lambda x: len(x), reverse=True)构建正则匹配模式
核心是用负向零宽断言排除地名前是"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')$'执行清洗并处理结果
用str.replace()批量替换,再用strip()去除替换后可能残留的末尾空格:# 可选添加flags=re.IGNORECASE实现大小写不敏感匹配 df['cleaned_name'] = df['company_name'].str.replace(pattern, '', regex=True).str.strip()
最终效果
处理后的cleaned_name列结果如下:
| company_name | cleaned_name |
|---|---|
| KFC liverpool | KFC |
| Taxis in Liverpool | Taxis in Liverpool |
| ABC West Essex | ABC |
| XYZ of West Essex | XYZ of West Essex |
| London Foods | London Foods |
| Cafe in London | Cafe in London |
完全符合需求:仅移除末尾且前面不是"of"/"in"的地名,同时正确处理多词地名。
内容的提问来源于stack exchange,提问作者gol.mat
相关产品推荐
相关产品推荐

