如何从Pandas DataFrame地址字段提取含指定关键词的完整子串?
解决Pandas中提取含指定关键词的完整子串问题
问题背景
给定Pandas数据集:
import pandas as pd df = pd.DataFrame({'addressfrom': ['Hüseyinağa, Rexee Hotel, Büyük Bayram Sokak', 'Rixos Premium', '123 Main St, Hotel Hilton Antalya', 'Residence Hotel & SPA, 1234']})
以及关键词列表:
keywords = ['hotel', 'resort', 'hilton', 'novotel', 'rixos', 'palace', 'residence', 'radisson', 'holiday', 'apartments', 'plaza', 'inn', 'club', 'spa']
需要从addressfrom字段的每个字符串中,提取包含任一关键词的完整子串(子串以逗号或短横线分隔),清除无关冗余内容。此前的正则仅能提取单个关键词,无法获取完整目标子串。
解决思路
核心是构建能匹配分隔符间完整子串的正则:
- 将关键词列表转换为正则备选组,支持大小写不匹配(原数据存在大小写混合的关键词)
- 匹配以逗号/短横线为边界的子串,只要子串内包含任一关键词
- 用Pandas的字符串方法批量提取并处理结果
完整实现代码
import pandas as pd import re # 初始化数据 df = pd.DataFrame({'addressfrom': ['Hüseyinağa, Rexee Hotel, Büyük Bayram Sokak', 'Rixos Premium', '123 Main St, Hotel Hilton Antalya', 'Residence Hotel & SPA, 1234']}) keywords = ['hotel', 'resort', 'hilton', 'novotel', 'rixos', 'palace', 'residence', 'radisson', 'holiday', 'apartments', 'plaza', 'inn', 'club', 'spa'] # 构建正则表达式:匹配包含任一关键词的、以逗号/短横线分隔的完整子串 # 用\b确保关键词是独立词(避免部分匹配),re.IGNORECASE忽略大小写 keyword_pattern = '|'.join([f'\\b{kw}\\b' for kw in keywords]) # 匹配分隔符外的完整子串,子串内包含关键词 regex = re.compile(r'(?:^|[, -]+)([^, -].*?(?:' + keyword_pattern + ').*?)(?:[, -]+|$)', re.IGNORECASE) # 定义提取函数:提取所有符合条件的子串,去重并整理为字符串 def extract_target_substrings(s): matches = regex.findall(s) # 去除前后空白,去重 cleaned = [match.strip() for match in matches] cleaned = list(set(cleaned)) # 去重 return ', '.join(cleaned) if cleaned else None # 应用到DataFrame df['extracted_hotels'] = df['addressfrom'].apply(extract_target_substrings) print(df)
运行结果
addressfrom extracted_hotels 0 Hüseyinağa, Rexee Hotel, Büyük Bayram Sokak Rexee Hotel 1 Rixos Premium Rixos Premium 2 123 Main St, Hotel Hilton Antalya Hotel Hilton Antalya 3 Residence Hotel & SPA, 1234 Residence Hotel & SPA
关键说明
- 正则中的
(?:^|[, -]+)和(?:[, -]+|$)用于匹配子串的边界(开头/逗号/短横线/结尾) .*?(?:keyword_pattern).*?确保匹配包含关键词的完整子串,非贪婪模式避免过度匹配re.IGNORECASE统一处理大小写,无需手动转换字符串大小写
内容的提问来源于stack exchange,提问作者Sergey Kuznetsov
相关产品推荐
相关产品推荐

