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

re.IGNORECASE标志在pandas .str.extract中失效问题求助

问题原因

你遇到的问题核心在于:str.extract 配合 re.IGNORECASE 确实能忽略大小写匹配文本,但它返回的是原字符串中的原始大小写内容;而 map 方法是严格区分大小写的,比如提取出的 "Cocktails" 和字典中的 "cocktails" 会被判定为不同的键,导致映射失败返回 NaN。

解决方案

下面提供两种高效的解决方式:

方法一:向量化处理(推荐,适合大数据量)

将提取结果和字典键统一为相同大小写(比如全小写),再进行映射:

import re
import pandas as pd

test_data = {
    "first_name": ['Bruce', 'Clark', 'Bruce', 'James', 'Nanny', 'Dot'],
    "last_name": ['Lee', 'Kent', 'Banner', 'Bond', 'Mc Phee', 'Cotton'],
    "title": ['mr', 'mr', 'mr', 'mr', 'mrs', 'mrs'],
    "text": ["He is a Kung Fu master", "Wears capes and tight Pants", "Cocktails shaken not stirred", "angry Green man", "suspect scottish accent", "East end legend"],
    "age": [32, 33, 28, 30, 42, 80]
}
df = pd.DataFrame(test_data)

category_dict = {
                 "Kung Fu":"Martial Art", 
                 "capes":"Clothing", 
                 "cocktails": "Drink", 
                 "green": "Colour", 
                 "scottish": "Scotland", 
                 "East": "Direction"
                 }

# 1. 构建小写键的映射字典
lower_case_dict = {k.lower(): v for k, v in category_dict.items()}
# 2. 转义字典键中的特殊字符,避免正则错误
escaped_keys = [re.escape(k) for k in category_dict.keys()]

df['category'] = (
    df['text'].str.extract(
        fr"\b({'|'.join(escaped_keys)})\b",
        flags=re.IGNORECASE)[0]
    # 3. 将提取结果转为小写,和字典键匹配
    .str.lower()
    .map(lower_case_dict)
)

print(df)

方法二:逐行匹配(直观易读,适合小数据集)

用 apply 遍历每行文本,直接通过正则忽略大小写匹配字典键:

import re
import pandas as pd

test_data = {
    "first_name": ['Bruce', 'Clark', 'Bruce', 'James', 'Nanny', 'Dot'],
    "last_name": ['Lee', 'Kent', 'Banner', 'Bond', 'Mc Phee', 'Cotton'],
    "title": ['mr', 'mr', 'mr', 'mr', 'mrs', 'mrs'],
    "text": ["He is a Kung Fu master", "Wears capes and tight Pants", "Cocktails shaken not stirred", "angry Green man", "suspect scottish accent", "East end legend"],
    "age": [32, 33, 28, 30, 42, 80]
}
df = pd.DataFrame(test_data)

category_dict = {
                 "Kung Fu":"Martial Art", 
                 "capes":"Clothing", 
                 "cocktails": "Drink", 
                 "green": "Colour", 
                 "scottish": "Scotland", 
                 "East": "Direction"
                 }

def match_category(text):
    for key, cat in category_dict.items():
        # 用re.search忽略大小写匹配单词边界
        if re.search(rf"\b{re.escape(key)}\b", text, flags=re.IGNORECASE):
            return cat
    return None

df['category'] = df['text'].apply(match_category)

print(df)
关键注意事项
  • 正则中的 \b 是单词边界,确保匹配的是完整单词(比如不会把 "Green" 和 "Greenery" 混淆)。
  • 用 re.escape(key) 转义字典键中的特殊字符(比如 .、* 等),避免正则表达式解析出错。

内容的提问来源于stack exchange,提问作者DECROMAX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:15:35