Python中如何选择性合并两个DataFrame?
解决方案:用左连接保留所有对战记录
你丢行的核心原因是默认的merge用的是内连接(inner join),只有两边DataFrame完全匹配的行才会保留。如果DF2里的某些对战记录(比如某队某年份)在DF1里没有对应数据,这些行就会被直接过滤掉。
改用**左连接(left join)**就能保留DF2的所有行,DF1里匹配不上的统计数据会用NaN填充,不会丢行。同时可以通过后缀参数区分两支球队的统计列,避免列名重复。
优化后的代码
# 第一次合并:关联Team1的年度统计数据,保留DF2所有行,给Team1的统计列加后缀 DF3 = DF2.merge( DF1, left_on=['Year', 'Team 1'], right_on=['Year', 'Team'], how='left', suffixes=('', '_team1') ) # 删除重复的Team列(来自DF1的Team字段) DF3.drop('Team', axis=1, inplace=True) # 第二次合并:关联Team2的年度统计数据,同样保留所有行,给Team2的统计列加后缀 DF3 = DF3.merge( DF1, left_on=['Year', 'Team 2'], right_on=['Year', 'Team'], how='left', suffixes=('', '_team2') ) # 删除重复的Team列 DF3.drop('Team', axis=1, inplace=True)
额外排查点
如果用左连接后还是有数据缺失,大概率是球队名称或年份的格式不匹配:
- 检查球队名称是否有大小写差异(比如"Team A" vs "team a")
- 检查年份是否有格式问题(比如字符串类型的"2023" vs 数值类型的2023)
- 可以先对DF1和DF2的
Year和球队列做标准化处理,比如统一转成大写、去除空格等。
内容的提问来源于stack exchange,提问作者VanillaMartti
相关产品推荐
相关产品推荐

