如何通过循环为3×8体育赛事数据集向Pandas DataFrame追加数据?
用Pandas批量追加体育赛事数据到Excel(保留单次表头)
问题描述
需要用Pandas将数千场体育赛事结果记录到Excel,要求每次循环生成一个3行8列的表格(示例如下),仅保留一次表头,后续新的3×8表格追加到已有数据下方。
示例表格:
| Date | Teams | HT Result | FT Result | Odds | % Win | %Pts | FHG/BTTS |
|---|---|---|---|---|---|---|---|
| 3/7/2023 | Home | 1 | 2 | 2.5 | 40% | 90% | 70% |
| away | 1 | 3 | 3.3 | 22% | 60% | 20% | |
| 3.4 | 38% | 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次数:
- 定义完整的列名(包含示例中的
Date列,你的原始代码缺少该列) - 初始化空的总DataFrame
- 循环生成每场赛事的3行数据,构造成小DataFrame后追加到总DataFrame
- 最后将总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
相关产品推荐
相关产品推荐

