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

pandas中如何合并人名格式不一致的数据集并避免同姓误匹配

问题原因

直接关联得到全空Rating的核心原因是两个表的Player字段格式完全不统一:player_nationalities存储的是球员全名,player_ratings存储的是「名字首字母+.+姓氏」的缩写格式,字符串内容不相等自然无法匹配。
如果图省事只提取姓氏做关联,会把同姓不同名的球员错配到一起,必须同时保留名字首字母作为区分标识。

操作步骤

核心思路是给两个表生成格式完全一致的匹配键,匹配键规则统一为「名字首字母+. +完整姓氏部分」,既保证格式对齐能匹配上,又通过首字母区分同姓球员,降低错配概率。

  • 第一步:给国籍表生成匹配键
    对player_nationalities的全名字段做拆分,只按第一个空格切分(避免Ben Yedder、De Bruyne这类多段姓氏被切错),取名字部分的首字母拼接后续完整姓氏,生成和评分表格式一致的匹配键:
    import pandas as pd
    
    def convert_fullname_to_abbr(full_name):
        # 只拆分第一个空格,保留完整的多段姓氏
        first_name, last_name_part = full_name.split(' ', 1)
        return f"{first_name[0]}. {last_name_part}"
    
    player_nationalities["match_key"] = player_nationalities["Player"].apply(convert_fullname_to_abbr)
    
    处理后生成的match_key列值为K. Mbappé、W. Ben Yedder、G. Donnarumma,和评分表的Player字段内容完全一致。
  • 第二步:执行表关联
    用生成的匹配键和评分表的Player字段做左连接,合并后清理冗余列:
    merged_df = pd.merge(
        player_nationalities,
        player_ratings,
        left_on="match_key",
        right_on="Player",
        how="left"
    )
    # 清理冗余列,还原字段名
    merged_df = merged_df.drop(columns=["match_key", "Player_y"]).rename(columns={"Player_x": "Player"})
    
  • 第三步:错配校验(可选,推荐大数据集使用)
    极端场景下可能存在「名字首字母相同+姓氏完全相同」的不同球员,合并后可以加一层校验,把重复匹配的结果筛出来人工核对:
    duplicate_matches = merged_df[merged_df.duplicated(subset=["Player"], keep=False)]
    if not duplicate_matches.empty:
        print("检测到重复匹配项,请人工核对:")
        print(duplicate_matches)
    
合并结果

执行后得到正确的关联结果,不会出现Rating全为NaN的问题:

Player Nationality  Rating
0         Kylian Mbappé      France      93
1      Wissam Ben Yedder      France      89
2  Gianluigi Donnarumma       Italy      91

提示:如果数据集中存在带中间名、昵称的特殊姓名格式,可以根据实际数据微调convert_fullname_to_abbr函数的规则,只要保证两个表的匹配键生成逻辑一致、同时包含名字首字母标识和完整姓氏,就能兼顾匹配准确率和错配防控。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:15:46