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

如何从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字段的每个字符串中,提取包含任一关键词的完整子串(子串以逗号或短横线分隔),清除无关冗余内容。此前的正则仅能提取单个关键词,无法获取完整目标子串。

解决思路

核心是构建能匹配分隔符间完整子串的正则:

  1. 将关键词列表转换为正则备选组,支持大小写不匹配(原数据存在大小写混合的关键词)
  2. 匹配以逗号/短横线为边界的子串,只要子串内包含任一关键词
  3. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:12:36