FBref足球数据爬取问题:未开赛赛事无法加载至ML数据集
问题分析与解决方案
核心问题原因
你的代码使用默认的**内连接(inner join)**合并matches(包含已完赛+未开赛赛事)和shooting(仅包含已完赛赛事的射门数据),只有两边Date完全匹配的行才会被保留。未开赛赛事没有对应的射门统计数据,因此合并时被直接过滤掉了。
修复步骤
1. 改用左连接保留所有赛事行
将merge操作改为左连接(left join),这样matches中的所有赛事(包括未开赛的)都会被保留,没有射门数据的字段自动填充为NaN,适配机器学习中待预测样本的特征缺失场景。
2. 新增标记区分赛事状态
添加字段标记已完赛/未开赛赛事,方便后续对两类数据做不同处理(比如已完赛数据用于训练,未开赛数据用于预测)。
修改后的关键代码段
try: # 左连接保留matches中所有赛事行 team_data = matches.merge(shooting[["Date", "Sh", "SoT", "Dist", "FK", "PK", "PKatt"]], on="Date", how="left") # 标记赛事是否已完赛:已完赛赛事有明确比分,未开赛的Score为空或含'vs' team_data["Is_Played"] = team_data["Score"].notna() & ~team_data["Score"].str.contains("vs", na=False) except ValueError: continue
额外注意事项
- 未开赛赛事的
Score、Sh、SoT等字段会是NaN,后续机器学习预处理时可根据需求选择填充默认值(如0)、删除或用模型预测缺失值。 - 确保
matches和shooting的Date列格式统一(如YYYY-MM-DD),避免格式不匹配导致连接失败,可通过以下代码统一转换:matches["Date"] = pd.to_datetime(matches["Date"]) shooting["Date"] = pd.to_datetime(shooting["Date"])
内容的提问来源于stack exchange,提问作者mmoore0323
相关产品推荐
相关产品推荐

