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

使用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(已婚女性)"

这里的问题有两个:

  1. 执行顺序:先匹配了包含Mr的字符串,而"Mrs."里刚好包含"Mr"子串,导致已婚女性先被赋值为已婚男性,后续的Mrs匹配无法覆盖。
  2. 匹配精度:没有限定前缀的位置或边界,导致子串也会被误匹配。

按照上面的方案调整后,就能完美区分不同前缀对应的婚姻状态啦!

内容的提问来源于stack exchange,提问作者Sergio Urrea González

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:52:49