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

如何在Pandas中比较带重音与无重音的葡萄牙语姓名?

当然有办法解决这个问题!处理带重音的葡萄牙语姓名和无重音姓名的比对,最直接的方式就是移除重音标记,或者在比对时动态忽略重音。下面是具体的实现方案:

解决方案:移除重音标记

首先,我们可以写一个通用函数来移除字符串中的所有重音和特殊标记,利用Python的unicodedata模块就能轻松实现:

import unicodedata

def remove_accents(text):
    # 将字符规范化为NFKD格式(分解基字符和重音标记)
    normalized_text = unicodedata.normalize('NFKD', text)
    # 过滤掉所有组合重音标记,只保留基字符
    return ''.join([char for char in normalized_text if not unicodedata.combining(char)])

这个函数会自动处理葡萄牙语里的各种重音:比如Ç→C,Õ→O,É→E等等,完全匹配你给出的示例需求。

应用到DataFrame

接下来把这个函数应用到你的perfis_deputados的目标列上,生成无重音的新列(也可以直接在比对时使用,不需要保存新列):

方式1:生成无重音列(方便后续多次比对)

import pandas as pd

# 给DataFrame添加无重音的姓名列
perfis_deputados['nome_completo_sem_acento'] = perfis_deputados['nome_completo'].apply(remove_accents)
perfis_deputados['nome_eleitoral_sem_acento'] = perfis_deputados['nome_eleitoral'].apply(remove_accents)

之后你就可以直接用这些新列和另一个无重音的DataFrame进行比对,比如用merge关联:

# 假设另一个DataFrame叫outro_df,无重音姓名列是nome_sem_acento
merged_df = pd.merge(
    perfis_deputados,
    outro_df,
    left_on='nome_completo_sem_acento',
    right_on='nome_sem_acento',
    how='inner'
)

方式2:动态比对(无需生成新列)

如果不需要保存无重音列,可以直接在比对逻辑中应用函数:

# 筛选出和另一个DataFrame匹配的行
matched_rows = perfis_deputados[
    perfis_deputados['nome_completo'].apply(remove_accents).isin(outro_df['nome_sem_acento'])
]

原理说明

  • unicodedata.normalize('NFKD', text):把带重音的字符分解为基字符+组合重音标记,比如Õ会被分解成O和一个重音标记̃;
  • unicodedata.combining(char):判断字符是否是组合重音标记,返回True则过滤掉,只保留基字符,最终得到无重音的字符串。

这个方法完全兼容utf-8编码的字符串,刚好匹配你的DataFrame编码环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:14:55