Python 写入约27k行38列数据以获取约6+是否正常;小时?
我正在创建一个大约27k行的pandas数据框架,其中包含8列文本和30列浮动。从Google BigQuery中提取数据并创建DataFrame和其他格式变量大约需要5分钟。不过,一旦我开始写作,我就碰到了一堵砖墙。将这些数据写入工作表平均需要6个多小时。它每秒写入大约1.2行。我制作的其他excel模板花费的时间至少减少了70倍,每秒写入70-250多行。我不明白为什么要花这么长时间。有什么我可以做得更有效的吗 我尝试过使用,但我不知道如何使用单元格级格式。我发现的一切似乎都表明它不支持这一点。当我使用它的时候,查询、创建和编写都需要8分钟。添加单元格级格式怎么会花费这么多时间 我还尝试在创建工作簿时添加Python 写入约27k行38列数据以获取约6+是否正常;小时?,python,pandas,python-2.7,xlsxwriter,Python,Pandas,Python 2.7,Xlsxwriter,我正在创建一个大约27k行的pandas数据框架,其中包含8列文本和30列浮动。从Google BigQuery中提取数据并创建DataFrame和其他格式变量大约需要5分钟。不过,一旦我开始写作,我就碰到了一堵砖墙。将这些数据写入工作表平均需要6个多小时。它每秒写入大约1.2行。我制作的其他excel模板花费的时间至少减少了70倍,每秒写入70-250多行。我不明白为什么要花这么长时间。有什么我可以做得更有效的吗 我尝试过使用,但我不知道如何使用单元格级格式。我发现的一切似乎都表明它不支持这一
'constant\u memory':True
选项,效果可以忽略不计。我不知道还有什么可以尝试的。我查看了我正在访问的数据的大小,数据帧的大小约为24mb,格式变量的大小约为0.6
我的书写功能的一个最小示例是:
num\u行,num\u cols=main\u df.shape
对于tqdm中的r(xrange(num_行),desc='写入行'):
对于X范围内的c(数值):
工作表.write(r,c,main_df.iloc[r,c],excel_格式_数据[r][c])
我知道这会增加开销,但我将其用于我之前提到的其他文件,使用相同的代码,它们的速度要快得多。唯一的区别是行数,但不是按1-1的比例缩放
我希望输出需要一段时间,根据我运行的其他模板,可能需要2-3个小时。根据调查,他们用了不到30秒的时间写了12800行50列数据。他们的表格显示了时间与行数的相对比例为1:1,所以我需要大约一分钟的时间?目前需要6个多小时,所以显然有些地方出了问题
我使用的是MacBook pro 2017,带有2.3 GHz Intel Core i5和16 GB 2133 MHz LPDDR3 @juanpa.arrivillaga在评论中提供了一个对我帮助很大的答案(见上文)
基本上,
.iloc
效率极低,通过使用.iat
我可以将写入时间从~6小时缩短到~7分钟 没有。但为什么要逐行写入数据帧?这样做:main_df.iloc[r,c]
在一个循环中访问单个值是非常低效的,并且不是您应该使用的方式<代码>loc/基于iloc
的索引已优化,可用于处理大量的行/列。有很多开销,因为它会对齐索引等,这对于访问单个值来说是完全没有意义的。改用.iat
。或者一开始就避免使用pandas。有没有理由不使用内置的df.to\u excel
或df.to\u csv
方法并在pandas之外进行格式化?如果您需要以编程方式格式化,也可以通过使用df.to_excel
,然后使用openpyxl单独重新打开和格式化,将写入和格式化分开。您的程序的xlsxwriter写入部分不应与此类似。我通过xlsxwriter测试程序运行了一些测试字符串和数字数据,并在2.3 GHz Intel Core i7上在35秒内写入了27000行x 38列。调用iloc
更可能是问题所在。@QuangHoang@sundance我正在逐行写入数据帧,而不是使用内置的df.to\u excel
或df.to\u csv
来使用xlsxwriter的工作表。编写方法,以便可以对每个单元格进行格式化。我还没有找到写入数据的方法,并且在使用内置方法时仍然具有逐单元格的数据格式。