Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 写入约27k行38列数据以获取约6+是否正常;小时?_Python_Pandas_Python 2.7_Xlsxwriter - Fatal编程技术网

Python 写入约27k行38列数据以获取约6+是否正常;小时?

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多行。我不明白为什么要花这么长时间。有什么我可以做得更有效的吗 我尝试过使用,但我不知道如何使用单元格级格式。我发现的一切似乎都表明它不支持这一

我正在创建一个大约27k行的pandas数据框架,其中包含8列文本和30列浮动。从Google BigQuery中提取数据并创建DataFrame和其他格式变量大约需要5分钟。不过,一旦我开始写作,我就碰到了一堵砖墙。将这些数据写入工作表平均需要6个多小时。它每秒写入大约1.2行。我制作的其他excel模板花费的时间至少减少了70倍,每秒写入70-250多行。我不明白为什么要花这么长时间。有什么我可以做得更有效的吗

我尝试过使用,但我不知道如何使用单元格级格式。我发现的一切似乎都表明它不支持这一点。当我使用它的时候,查询、创建和编写都需要8分钟。添加单元格级格式怎么会花费这么多时间

我还尝试在创建工作簿时添加
'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的
工作表。编写
方法,以便可以对每个单元格进行格式化。我还没有找到写入数据的方法,并且在使用内置方法时仍然具有逐单元格的数据格式。