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

