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
相关产品推荐
相关产品推荐

