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

如何将数据集中同一作者的多种姓名格式统一为单一标准格式?

会议论文作者姓名标准化:高效向量化实现方案

问题背景

现有会议论文数据集,每行包含年份、标题、作者列表(均为字符串,作者以逗号分隔),示例数据如下:

Year    Title                                              Author(s)
'2011'  'I watched all the Simpsons episodes in one week'  'Ludwig van Beethoven, Joseph Haydn, Wolfgang Amadeus Mozart'

为构建可在线搜索的数据库,需要统一同一作者的多种姓名变体,比如:

  • Wolfgang A. Mozart
  • W. A. Mozart
  • Mr Wolfgang A. Mozart
  • W. A. Mozart (Austria)

目标是把这些变体全部替换为标准姓名Wolfgang Amadeus Mozart,当前循环替换的方式过于繁琐,需要更高效的向量化实现。

当前循环写法:

names = ['Wolfgang A. Mozart','W. A. Mozart','Mr Wolfgang A. Mozart','W. A. Mozart (Austria)']
for n in names:
    db['Authors'] = db['Authors'].str.replace(n,'Wolfgang Amadeus Mozart', regex=True)

高效向量化实现方法

方法1:正则表达式批量匹配替换

把所有变体整合成一个正则匹配模式,一次性完成替换,避免多次调用str.replace:

import re

# 转义变体里的正则特殊字符(比如括号),用|分隔所有匹配项
pattern = re.compile(r'|'.join(re.escape(name) for name in names))
# 批量替换所有匹配的变体
db['Authors'] = db['Authors'].str.replace(pattern, 'Wolfgang Amadeus Mozart', regex=True)

这种方法一次遍历数据就完成所有替换,比循环效率高很多,还能避免重复修改列数据。

方法2:字典映射+Pandas原生replace

直接用字典建立「变体→标准名」的映射,Pandas会自动做向量化处理,不用写循环:

# 构建映射字典
name_map = {
    'Wolfgang A. Mozart': 'Wolfgang Amadeus Mozart',
    'W. A. Mozart': 'Wolfgang Amadeus Mozart',
    'Mr Wolfgang A. Mozart': 'Wolfgang Amadeus Mozart',
    'W. A. Mozart (Austria)': 'Wolfgang Amadeus Mozart'
}

# 精确匹配替换,关闭正则模式
db['Authors'] = db['Authors'].str.replace(name_map, regex=False)

如果需要更灵活的匹配(比如忽略空格、匹配带后缀的变体),可以把字典的键改成正则表达式,同时打开regex=True:

# 正则映射:匹配带头衔、后缀的变体
regex_name_map = {
    r'Mr\s+Wolfgang\s+A\.\s+Mozart': 'Wolfgang Amadeus Mozart',
    r'W\.\s+A\.\s+Mozart(\s+\(.*\))?': 'Wolfgang Amadeus Mozart',
    r'Wolfgang\s+A\.\s+Mozart': 'Wolfgang Amadeus Mozart'
}

db['Authors'] = db['Authors'].str.replace(regex_name_map, regex=True)

方法3:拆分-替换-合并(精准处理单个作者)

如果担心变体和其他作者姓名片段重叠,可以先把作者列表拆分成单个作者,替换后再合并:

# 拆分每个行的作者列表为独立列
split_authors = db['Authors'].str.split(',\s+', expand=True)
# 对每个作者应用映射替换
standardized_authors = split_authors.replace(name_map, regex=False)
# 合并回逗号分隔的字符串,去掉空值
db['Authors'] = standardized_authors.apply(lambda row: ', '.join(row.dropna()), axis=1)

这种方式能确保只替换完整的作者姓名,不会误改其他内容。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:27:40