You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过循环为3×8体育赛事数据集向Pandas DataFrame追加数据?

用Pandas批量追加体育赛事数据到Excel(保留单次表头)

问题描述

需要用Pandas将数千场体育赛事结果记录到Excel,要求每次循环生成一个3行8列的表格(示例如下),仅保留一次表头,后续新的3×8表格追加到已有数据下方。

示例表格:

DateTeamsHT ResultFT ResultOdds% Win%PtsFHG/BTTS
3/7/2023Home122.540%90%70%
away133.322%60%20%
3.438%40%30%

已实现单场数据生成代码:

df = pd.DataFrame([["Brentford", 1, 3, 2.15, 39, 90, 70],["Fordham" , 1, 2, 3.3, 22, 60, 20],["", "", "", 3.4, 38, 40, 30]],index=[Date, '', ''], columns=['Teams', 'HT Result', 'FT Result', 'ML Odds', 'Raw ML', 'Pts', 'FHG / BTTS'])

但不清楚如何实现循环追加,是否需要逐列追加到变量?


解决方案

方法1:先收集所有数据到总DataFrame,一次性写入Excel

这种方法效率更高,适合数据量较大的场景,减少磁盘IO次数:

  1. 定义完整的列名(包含示例中的Date列,你的原始代码缺少该列)
  2. 初始化空的总DataFrame
  3. 循环生成每场赛事的3行数据,构造成小DataFrame后追加到总DataFrame
  4. 最后将总DataFrame写入Excel,自动生成单次表头

示例代码:

import pandas as pd

# 定义与示例表格完全匹配的列名
full_columns = ['Date', 'Teams', 'HT Result', 'FT Result', 'Odds', '% Win', '%Pts', 'FHG/BTTS']
# 初始化空的总数据容器
total_df = pd.DataFrame(columns=full_columns)

# 模拟循环处理数千场赛事(替换为你的实际赛事数据源循环)
for match_idx in range(10):
    # 模拟当前赛事日期
    current_date = f"3/{7+match_idx}/2023"
    # 构建当前赛事的3行数据(补全Date列)
    match_rows = [
        [current_date, "Brentford", 1, 3, 2.15, "39%", 90, "70%"],
        [current_date, "Fordham", 1, 2, 3.3, "22%", 60, "20%"],
        [current_date, "", "", "", 3.4, "38%", 40, "30%"]
    ]
    # 转换为小DataFrame
    match_df = pd.DataFrame(match_rows, columns=full_columns)
    # 追加到总DataFrame(ignore_index重置索引,避免重复)
    total_df = pd.concat([total_df, match_df], ignore_index=True)

# 写入Excel,index=False不保留Pandas默认索引
total_df.to_excel("sports_results.xlsx", index=False)

方法2:循环直接追加到Excel文件(适合内存有限场景)

如果赛事数量极大,内存无法容纳所有数据,可以直接循环写入Excel,通过控制参数实现仅写一次表头:

import pandas as pd
from openpyxl import load_workbook

full_columns = ['Date', 'Teams', 'HT Result', 'FT Result', 'Odds', '% Win', '%Pts', 'FHG/BTTS']
excel_path = "sports_results.xlsx"

# 初始化写入器,判断文件是否存在以控制表头写入
try:
    # 文件已存在,加载现有工作簿,后续追加不写表头
    book = load_workbook(excel_path)
    writer = pd.ExcelWriter(excel_path, engine='openpyxl', mode='a', if_sheet_exists='overlay')
    writer.book = book
    writer.sheets = {ws.title: ws for ws in book.worksheets}
    # 获取当前已有数据的最后一行,作为新数据的起始行
    start_row = writer.sheets['Sheet1'].max_row
    write_header = False
except FileNotFoundError:
    # 文件不存在,创建新文件并写入表头
    writer = pd.ExcelWriter(excel_path, engine='openpyxl')
    start_row = 0
    write_header = True

# 模拟循环处理赛事
for match_idx in range(10):
    current_date = f"3/{7+match_idx}/2023"
    match_rows = [
        [current_date, "Brentford", 1, 3, 2.15, "39%", 90, "70%"],
        [current_date, "Fordham", 1, 2, 3.3, "22%", 60, "20%"],
        [current_date, "", "", "", 3.4, "38%", 40, "30%"]
    ]
    match_df = pd.DataFrame(match_rows, columns=full_columns)
    
    # 写入数据,仅第一次写入时输出表头
    match_df.to_excel(writer, sheet_name='Sheet1', startrow=start_row, index=False, header=write_header)
    # 关闭后续写入的表头开关,更新起始行位置
    write_header = False
    start_row += len(match_df)

# 保存并关闭写入器
writer.close()

关键注意点

  • 你的原始代码缺少Date列,需要补全才能和示例表格结构匹配
  • 百分比数据建议统一格式:要么存储为字符串(如"39%"),要么存储为数值(如39),避免后续Excel格式混乱
  • 优先选择方法1,磁盘IO更少,运行效率更高;方法2仅在内存不足时使用

内容的提问来源于stack exchange,提问作者Roo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:15:04