Pandas合并Web爬取数据表产生重复行 按TEAM和Year去重方案
MLB数据表合并去重解决方案
问题根因
现有合并逻辑仅以Year作为关联键,单一年份对应多支球队记录时会生成笛卡尔积匹配结果:例如单年度存在30支球队数据,左表1条该年度记录会匹配右表30条同年度记录,直接产生大量无效重复行。
修复步骤
- 合并时将
TEAM、Year同时设为关联匹配键,仅当两个字段取值完全一致时才拼接对应行,从根源避免跨球队的错误匹配。合并前需确认两张表的球队字段名完全统一,若投手表球队字段名不为TEAM,先做字段重命名即可。 - 追加兜底去重逻辑:若单表内部本身存在同球队、同年份的重复记录,合并后以
TEAM+Year为判断依据去重,保留首条有效记录。
参考代码
# 前置检查:若mlb_pitch_df中球队字段名不是TEAM,先执行重命名 # 示例:mlb_pitch_df = mlb_pitch_df.rename(columns={'原球队字段名':'TEAM'}) # 双维度关联合并 mlb_df = mlb_bat_df.merge( mlb_pitch_df[['TEAM','Year','RA/G','ERA','CG','tSho','SV','IP', 'H_A','R_A','ER','HR_A','BB_A','Ks','WHIP','SO9','HR9','PAge']], on=['TEAM', 'Year'], how='left' # 以打击表为基准保留全量数据,可根据实际需求替换为inner/right ) # 兜底去重,消除同球队同年份的重复行 mlb_df = mlb_df.drop_duplicates(subset=['TEAM', 'Year'], keep='first')
前置校验建议
合并前可先分别检查两张表内的TEAM+Year组合是否唯一,提前处理单表内的重复数据,减少后续异常:
# 输出两张表中(TEAM,Year)组合的重复数量 print("打击表重复条目数:", mlb_bat_df[['TEAM','Year']].duplicated().sum()) print("投手表重复条目数:", mlb_pitch_df[['TEAM','Year']].duplicated().sum())
若两张表存在除关联键外的同名字段,merge会自动为左表字段加
_x后缀、右表字段加_y后缀,可按需调整列名。
内容的提问来源于stack exchange,提问作者Pappy Oh
相关产品推荐
相关产品推荐

