下面的代码只将页面上的最后一个表格导出到excel,但是当我运行打印功能时,它会打印所有的表格。我的代码是否存在问题导致无法将所有数据导出到 Excel?
我也尝试过导出为 .csv 文件,但没有成功。
import pandas as pd
url = 'https://www.vegasinsider.com/college-football/matchups/'
dfs = pd.read_html(url)
for df in dfs:
if len(df.columns) > 1:
df.to_excel(r'VegasInsiderCFB.xlsx', index = False)
#print(df)
最佳答案
你的问题是每次df.to_excel
被调用,你正在覆盖文件,所以只剩下最后一个 df 。您需要做的是使用编写器并为每个单独的 df
指定工作表名称例如:
url = 'https://www.vegasinsider.com/college-football/matchups/'
writer = pd.ExcelWriter('VegasInsiderCFB.xlsx', engine='xlsxwriter')
dfs = pd.read_html(url)
counter = 0
for df in dfs:
if len(df.columns) > 4:
counter += 1
df.to_excel(writer, sheet_name = f"sheet_{counter}", index = False)
writer.save()
您可能需要 pip install xlsxwriter xlwt
让它工作。导出到 csv 将永远无法工作,因为 csv 是单个数据表(就像 excel 中的单个工作表),因此在这种情况下,您需要为每个 df 使用新的 csv。
正如评论中所指出的,可以在不更改
df
的情况下将数据写入单张纸上。 s,但合并它们可能要好得多:import pandas as pd
import numpy as np
url = 'https://www.vegasinsider.com/college-football/matchups/'
dfs = pd.read_html(url)
dfs = [df for df in dfs if len(df.columns) > 4]
columns = ["gameid","game time", "team"] + list(dfs[0].iloc[1])[1:]
N = len(dfs)
values = np.empty((2*N,len(columns)),dtype=np.object)
for i,df in enumerate(dfs):
time = df.iloc[0,0].replace(" Game Time","")
values[2*i:2*i+2,2:] = df.iloc[2:,:]
values[2*i:2*i+2,:2] = np.array([[i,time],[i,time]])
newdf = pd.DataFrame(values,columns = columns)
newdf.to_excel("output.xlsx",index = False)
我用了numpy.array
对象类型,以便能够轻松地将原始数据帧中的子矩阵复制到其预期位置。我还需要创建一个 gameid
,将游戏跨行连接起来。现在重写它应该是微不足道的,因此您可以遍历一个 url 列表并将它们写入单独的工作表。
关于python - Pandas 仅将 1 个表导出到 Excel 但打印所有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69636702/