如何最优合并两个DataFrame?解决球队列批量匹配难题
批量合并球队名称不匹配的DataFrame方案
核心思路
不用逐例调整命名,而是通过统一提取队名核心标识或模糊匹配的方式,批量对齐两个DataFrame的球队名称,再完成合并。
方法1:提取核心队名实现精准匹配
适用于队名格式规律的场景(比如df2的队名是「城市+队名」,df1的队名只有核心队名):
- 先拆分df1中包含多支球队的行,把每个队名单独成一行:
import pandas as pd # 假设df1是你的第一个DataFrame,包含「大都市区」「2016年预估人口」「NHL球队」列 df1_expanded = df1.assign(NHL球队=df1['NHL球队'].str.split()).explode('NHL球队') - 给两个DataFrame提取核心队名:
# 从df2的「球队名称」中提取最后一个单词(NHL队名大多是后缀) df2['核心队名'] = df2['球队名称'].str.split().str[-1] # df1拆分后的队名直接作为核心队名 df1_expanded['核心队名'] = df1_expanded['NHL球队'] - 基于核心队名列合并:
merged_df = pd.merge(df1_expanded, df2, on='核心队名', how='left') - 后续可按需整理:比如把同一城市的多支球队数据聚合,或保留原始字段。
方法2:模糊匹配处理复杂命名差异
如果队名格式不规律(比如存在缩写、特殊后缀),用模糊匹配批量对齐:
- 先安装依赖库(若未安装):
pip install fuzzywuzzy python-Levenshtein - 编写匹配函数,给df1的每个队名找df2中最相似的匹配项:
from fuzzywuzzy import process def match_team(team_name, candidate_teams, threshold=80): # 匹配分数≥threshold才返回结果,避免错误匹配 best_match, score = process.extractOne(team_name, candidate_teams) return best_match if score >= threshold else None # 给df1拆分后的每行匹配df2的球队名称 df1_expanded['匹配球队名称'] = df1_expanded['NHL球队'].apply( lambda x: match_team(x, df2['球队名称'].tolist()) ) - 基于匹配后的列合并:
merged_df = pd.merge(df1_expanded, df2, left_on='匹配球队名称', right_on='球队名称', how='left') - 调整
threshold参数控制匹配严格度:分数越高,匹配越精准,但可能漏掉部分相似队名;分数越低,覆盖越广,但可能出现错误匹配。
补充优化建议
- 对少量特殊队名(比如「New Jersey Devils」「Tampa Bay Lightning」这类多词队名),可以先做一个小型映射表,手动处理特殊情况后,再用上述方法批量处理常规队名。
- 合并后要抽查结果,对匹配错误的行做手动修正,确保数据准确性。
内容的提问来源于stack exchange,提问作者Bruno Ramos Martins
相关产品推荐
相关产品推荐

