如何在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
相关产品推荐
相关产品推荐

