如何处理Pandas输出DataFrame时空值列被自动跳过的问题
问题根因
你遇到的score列缺失问题由两个错误导致:
GameData类初始化时未定义score属性,将类实例转换为DataFrame时该字段不存在,会被直接忽略parse_data函数内的score取值逻辑完全错误:硬编码score = None后判断非空就返回,永远无法正确读取比分,还会提前中断循环
修改方案
1. 修正GameData类定义
给GameData类的初始化方法新增score列表属性:
class GameData: def __init__(self): self.date = [] self.time = [] self.country = [] self.league = [] self.game = [] self.score = [] # 新增score属性 self.home_odds = [] self.draw_odds = [] self.away_odds = []
2. 修正parse_data内的score取值逻辑
删除原来的错误逻辑,从行数据中读取比分,无值时填充空值:
for row in df.itertuples(): if not isinstance(row[1], str): continue elif ':' not in row[1]: country = row[1].split('»')[0] continue game_time = row[1] game_date = row[1].split('-')[0] # 修正score取值逻辑:row[3]为比分列,无有效值时填充pd.NA score = row[3] if pd.notna(row[3]) else pd.NA # 删除原来的错误提前返回逻辑 game_data.date.append(game_date) game_data.time.append(game_time) game_data.country.append(country) game_data.league.append(count[1].text) game_data.game.append(row[2]) game_data.score.append(score) game_data.home_odds.append(row[4]) game_data.draw_odds.append(row[5]) game_data.away_odds.append(row[6])
3. 可选优化:兼容高版本Pandas的合并逻辑
高版本Pandas已经废弃DataFrame.append方法,建议替换为pd.concat提升运行效率和版本兼容性:
if __name__ == '__main__': start_url = "https://www.oddsportal.com/matches/soccer/" browser = webdriver.Chrome() urls = get_urls(browser, start_url) urls.insert(0, start_url) result_list = [] # 用列表存所有单页结果,最后统一合并 for number, url in enumerate(urls): if number > 0: browser.get(url) html = browser.page_source game_data = parse_data(html) if game_data is None: continue result = pd.DataFrame(game_data.__dict__) result_list.append(result) # 最后一次性合并所有数据 results = pd.concat(result_list, ignore_index=True)
修改完成后生成的DataFrame就会完整保留score列,无比分的行对应值会自动填充为空值。
内容的提问来源于stack exchange,提问作者PyNoob
相关产品推荐
相关产品推荐

