使用str_detect精准匹配时的婚姻状态分类错误问题
解决姓名前缀分类错误的问题
看起来你遇到的问题是匹配规则没精准区分完整前缀,或者条件判断顺序不对——比如用str.contains('Mr')时,"Mrs."里的"Mr"子串会被误匹配,导致已婚女性被错归到已婚男性类别里。下面给你两个靠谱的解决方案:
方案1:调整匹配顺序+精准正则(推荐)
优先匹配更具体的前缀(比如Mrs.),同时用正则的单词边界(\b)确保匹配的是完整前缀,而非子串:
import pandas as pd import numpy as np # 假设你的数据框是df,包含name列 conditions = [ # 先匹配已婚女性前缀,避免被后续规则覆盖 df['name'].str.contains(r'\bMrs\.', regex=True), # 匹配已婚男性的前缀,用|分隔,同样加单词边界 df['name'].str.contains(r'\bMr\.|\bMs\.|\bMme\.', regex=True) ] titles = [ "Mujer casada(已婚女性)", "Hombre casado(已婚男性)" ] # 给title列赋值,未匹配到的设为默认值 df['title'] = np.select(conditions, titles, default="Sin clasificar(未分类)")
方案2:用startswith匹配开头前缀(更简单)
姓名前缀通常出现在字符串开头,用str.startswith会更精准,直接匹配开头的前缀,完全避免子串误匹配的问题:
import pandas as pd import numpy as np conditions = [ df['name'].str.startswith('Mrs.'), # 传入元组可同时匹配多个前缀 df['name'].str.startswith(('Mr.', 'Ms.', 'Mme.')) ] titles = [ "Mujer casada(已婚女性)", "Hombre casado(已婚男性)" ] df['title'] = np.select(conditions, titles, default="Sin clasificar(未分类)")
为什么原来的代码会出错?
举个典型的错误示例:
# 错误示例:先匹配Mr,导致Mrs被误判 df.loc[df['name'].str.contains('Mr|Ms|Mme'), 'title'] = "Hombre casado(已婚男性)" df.loc[df['name'].str.contains('Mrs'), 'title'] = "Mujer casada(已婚女性)"
这里的问题有两个:
- 执行顺序:先匹配了包含
Mr的字符串,而"Mrs."里刚好包含"Mr"子串,导致已婚女性先被赋值为已婚男性,后续的Mrs匹配无法覆盖。 - 匹配精度:没有限定前缀的位置或边界,导致子串也会被误匹配。
按照上面的方案调整后,就能完美区分不同前缀对应的婚姻状态啦!
内容的提问来源于stack exchange,提问作者Sergio Urrea González
相关产品推荐
相关产品推荐

