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

向空DataFrame追加多个子DataFrame失败,仅显示最后一个数据

问题分析

你遇到的核心问题是循环中未正确累积DataFrame:

  • 你初始化了空的appended_data,但每次循环都基于这个空表去append当前表格,再把结果赋值给appended——这导致每次循环都是空表+当前单表,最终appended只保留最后一次循环的结果。
  • 另外,pandas.DataFrame.append已被标记为废弃(Deprecated),官方推荐用pd.concat实现数据拼接。
修复方案

方案1:修正累积逻辑(兼容旧版pandas)

把每次append后的结果重新赋值给累积变量,确保每次都是基于之前的数据继续追加:

import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from datetime import date, datetime

currentDay = datetime.now().day
currentMonth = datetime.now().month
currentYear = datetime.now().year
date = f'{currentYear}-{currentMonth}-{currentDay}'

url = f'https://www.racingandsports.com.au/form-guide/GenerateRaceGuide?discipline=thoroughbred&country=south-korea&course=busan&date={date}&meetingId=291056&cols=%5B%7B%22name%22%3A%22HTab%22%2C%22title%22%3A%22Tab%22%2C%22type%22%3A%22ND%22%2C%22size%22%3A%220.75%22%7D%2C%7B%22name%22%3A%22FormFigs5%22%2C%22title%22%3A%22Form%22%2C%22type%22%3A%22ND%22%2C%22size%22%3A%220.9375%22%7D%2C%7B%22name%22%3A%22HName%22%2C%22title%22%3A%22Horse%22%2C%22type%22%3A%22S%22%2C%22size%22%3A%222.25%22%7D%2C%7B%22name%22%3A%22HBP%22%2C%22title%22%3A%22BP%22%2C%22type%22%3A%22ND%22%2C%22size%22%3A%220.75%22%7D%2C%7B%22name%22%3A%22Jockey%22%2C%22title%22%3A%22Jockey%22%2C%22type%22%3A%22S%22%2C%22size%22%3A%222.25%22%7D%2C%7B%22name%22%3A%22Trainer%22%2C%22title%22%3A%22Trainer%22%2C%22type%22%3A%22S%22%2C%22size%22%3A%222.25%22%7D%2C%7B%22name%22%3A%22HWeight%22%2C%22title%22%3A%22Wt%22%2C%22type%22%3A%22D%22%2C%22size%22%3A%220.75%22%7D%5D&addCols=%5B%22prizemoney%22%5D&fs=S&page=port&preview=true'

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome('chromedriver', options=chrome_options)

driver.get(url)

appended_data = pd.DataFrame()

for i in range(1,10):
  data = driver.find_element(By.XPATH, f'//*[@id="parent"]/div[{i}]/div[2]/div/table').get_attribute('outerHTML')
  data_hdf = pd.read_html(data)[0]
  # 修复:将append结果重新赋值给累积变量,同时重置索引避免重复
  appended_data = appended_data.append(data_hdf, ignore_index=True)

appended_data

方案2:使用pd.concat(推荐,符合pandas最新规范)

创建列表存储所有表格的DataFrame,最后一次性拼接,效率更高:

import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from datetime import date, datetime

currentDay = datetime.now().day
currentMonth = datetime.now().month
currentYear = datetime.now().year
date = f'{currentYear}-{currentMonth}-{currentDay}'

url = f'https://www.racingandsports.com.au/form-guide/GenerateRaceGuide?discipline=thoroughbred&country=south-korea&course=busan&date={date}&meetingId=291056&cols=%5B%7B%22name%22%3A%22HTab%22%2C%22title%22%3A%22Tab%22%2C%22type%22%3A%22ND%22%2C%22size%22%3A%220.75%22%7D%2C%7B%22name%22%3A%22FormFigs5%22%2C%22title%22%3A%22Form%22%2C%22type%22%3A%22ND%22%2C%22size%22%3A%220.9375%22%7D%2C%7B%22name%22%3A%22HName%22%2C%22title%22%3A%22Horse%22%2C%22type%22%3A%22S%22%2C%22size%22%3A%222.25%22%7D%2C%7B%22name%22%3A%22HBP%22%2C%22title%22%3A%22BP%22%2C%22type%22%3A%22ND%22%2C%22size%22%3A%220.75%22%7D%2C%7B%22name%22%3A%22Jockey%22%2C%22title%22%3A%22Jockey%22%2C%22type%22%3A%22S%22%2C%22size%22%3A%222.25%22%7D%2C%7B%22name%22%3A%22Trainer%22%2C%22title%22%3A%22Trainer%22%2C%22type%22%3A%22S%22%2C%22size%22%3A%222.25%22%7D%2C%7B%22name%22%3A%22HWeight%22%2C%22title%22%3A%22Wt%22%2C%22type%22%3A%22D%22%2C%22size%22%3A%220.75%22%7D%5D&addCols=%5B%22prizemoney%22%5D&fs=S&page=port&preview=true'

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome('chromedriver', options=chrome_options)

driver.get(url)

# 创建列表存储所有表格DataFrame
df_list = []

for i in range(1,10):
  data = driver.find_element(By.XPATH, f'//*[@id="parent"]/div[{i}]/div[2]/div/table').get_attribute('outerHTML')
  data_hdf = pd.read_html(data)[0]
  df_list.append(data_hdf)

# 一次性拼接所有DataFrame,重置索引避免重复
appended_data = pd.concat(df_list, ignore_index=True)

appended_data

关键注意点

  • ignore_index=True:确保拼接后的DataFrame重置索引,避免索引重复问题
  • pd.concat比循环append更高效,尤其是数据量较大时——append每次都会创建新的DataFrame,而concat仅需一次操作
  • 已修复XPATH中的"为正常双引号",避免解析错误

内容的提问来源于stack exchange,提问作者Hasan Abdul Ghaffar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:50:23