移除匹配表头行的重复行:NFL数据爬取的去重优化需求
更高效移除重复表头行的方案
针对你爬取NFL数据时遇到的重复表头问题,以下几个方法比关键词过滤更通用、更可靠:
方案1:基于"表头行全等于列名"的特征过滤
重复出现的表头行有一个明确特征:每一列的内容都等于该列的列名。利用这个特征可以精准过滤所有这类行,无需依赖特定关键词:
# 替换原来的关键词过滤行 scorings_df = scorings_df[scorings_df.ne(scorings_df.columns).any(axis=1)]
- 原理:
scorings_df.ne(scorings_df.columns)逐单元格判断内容是否不等于列名,any(axis=1)确保只要该行有一个单元格不是列名(即有效数据行)就保留。 - 优势:不受表头文本大小写、未来赛事表头差异影响,完全通用。
方案2:针对数值型列的类型校验(适合Week列以数字为主的场景)
如果Week列的有效数据大多是数字(包括季后赛数字周次),可以通过类型转换过滤无法转为数字的表头行:
# 替换原来的关键词过滤行 scorings_df = scorings_df[pd.to_numeric(scorings_df['Week'], errors='coerce').notna()]
- 原理:
pd.to_numeric(..., errors='coerce')将非数字内容转为NaN,再通过notna()筛选出有效数字行。 - 注意:若Week列存在合法非数字文本(如"SuperBowl"),此方案会误删,此时优先用方案1。
整合方案后的完整代码示例
同时清理了原代码中冗余的初始赋值:
import pandas as pd import datetime current_year = 2023 url_scores = 'https://www.pro-football-reference.com/years/' # 初始化空DataFrame Scoring_df = pd.DataFrame() # 循环爬取最近2年数据(测试用) for year in range(current_year, current_year - 2, -1): year_url_stats = f"{url_scores}{year}/games.htm" Scores = pd.read_html(year_url_stats) scorings_df = Scores[0] # 用方案1过滤重复表头行 scorings_df = scorings_df[scorings_df.ne(scorings_df.columns).any(axis=1)] # 过滤未来赛事 scorings_df['TempDate'] = pd.to_datetime(scorings_df['Date'], errors='coerce') scorings_df = scorings_df[scorings_df['TempDate'] <= datetime.datetime.now()] scorings_df.drop(columns=['TempDate'], inplace=True) scorings_df['Year'] = year # 清理队名 scorings_df['Winner/tie'] = scorings_df['Winner/tie'].str.split().str[-1] scorings_df['Loser/tie'] = scorings_df['Loser/tie'].str.split().str[-1] # 重排列 columns_order = ['Year', 'Week', 'Day', 'Date', 'Time', 'Winner/tie', 'Loser/tie', 'PtsW', 'PtsL', 'YdsW', 'TOW', 'YdsL', 'TOL'] scorings_df = scorings_df[columns_order] Scoring_df = pd.concat([Scoring_df, scorings_df], ignore_index=True) print(Scoring_df.head())
方案优势说明
- 方案1完全不依赖特定列的关键词,避免了未来表头文本变化导致的失效问题;
- 比字符串匹配更高效,处理大量数据时优势明显;
- 逻辑直接针对重复表头的本质特征,更严谨可靠。
内容的提问来源于stack exchange,提问作者Victoria
相关产品推荐
相关产品推荐

