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

如何在Pandas中提取不含罗马数字的姓氏(含连字符复姓)

提取Pandas DataFrame中全名的姓氏(含连字符双姓氏)

正则表达式是否合适?

完全合适。你的这些全名格式有明显规律:姓氏都在字符串末尾,后面可能跟着带/不带逗号的罗马数字后缀。正则能精准定位并提取目标内容,是高效的解决方案。

处理方法

正则设计思路

核心是匹配字符串末尾的字母+连字符组合,同时忽略后面可能存在的罗马数字后缀(不管有没有逗号分隔):

  • ([\w-]+):捕获要提取的姓氏,允许字母、连字符(覆盖双姓氏场景)
  • (?:,?\s+(?:[IVXLCDM]+))?$:匹配可选的后缀部分(非捕获,不会被提取),包括:逗号(可选)+空格+罗马数字,$确保这是字符串的结尾

Pandas代码实现

先构造示例DataFrame:

import pandas as pd

data = {
    'full_name': [
        'Jon Doe',
        'Jon A. Doe',
        'Jon Anderson Doe',
        'Jon Doe II',
        'Jon Doe, IV',
        'Jon A. Doe, V',
        'Jon A. Doe X',
        'Jon Anderson Doe, VI',
        'Jon Anderson Doe VII',
        'Jon Anderson Doe-Stapleton VII',
        'Jon Anderson Doe-Stapleton, VII',
        'Jon Anderson Doe-Stapleton'
    ]
}
df = pd.DataFrame(data)

执行提取:

# 提取姓氏到新列
df['last_name'] = df['full_name'].str.extract(r'([\w-]+)(?:,?\s+(?:[IVXLCDM]+))?$', expand=False)

结果验证

处理后df['last_name']的结果为:

Doe
Doe
Doe
Doe
Doe
Doe
Doe
Doe
Doe
Doe-Stapleton
Doe-Stapleton
Doe-Stapleton

注意事项

  • 该正则默认名在前、姓氏在后的格式,如果你的数据存在姓氏在前的情况,需要调整正则逻辑
  • 罗马数字匹配覆盖了所有标准罗马数字字符(I/V/X/L/C/D/M),如果有特殊后缀格式,可针对性修改正则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:28:19