[英]How do I make a progress bar for loading pandas DataFrame from a large xlsx file?
来自https://pypi.org/project/tqdm/ :
import pandas as pd
import numpy as np
from tqdm import tqdm
df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))
tqdm.pandas(desc="my bar!")p`
df.progress_apply(lambda x: x**2)
我拿了这段代码并对其进行了编辑,以便我从 load_excel 创建一个 DataFrame 而不是使用随机数:
import pandas as pd
from tqdm import tqdm
import numpy as np
filename="huge_file.xlsx"
df = pd.DataFrame(pd.read_excel(filename))
tqdm.pandas()
df.progress_apply(lambda x: x**2)
这给了我一个错误,所以我将 df.progress_apply 更改为:
df.progress_apply(lambda x: x)
这是最终代码:
import pandas as pd
from tqdm import tqdm
import numpy as np
filename="huge_file.xlsx"
df = pd.DataFrame(pd.read_excel(filename))
tqdm.pandas()
df.progress_apply(lambda x: x)
这会产生一个进度条,但它实际上并没有显示任何进度,而是加载了进度条,并且在操作完成后跳到 100%,这违背了目的。
我的问题是:如何让这个进度条工作?
progress_apply 中的 function 实际上是做什么的?
有更好的方法吗? 也许是 tqdm 的替代品?
任何帮助是极大的赞赏。
不管用。 pd.read_excel
阻塞,直到文件被读取,并且无法从该函数获取有关其执行过程中进度的信息。
它适用于您可以按块进行的读取操作,例如
chunks = []
for chunk in pd.read_csv(..., chunksize=1000):
update_progressbar()
chunks.append(chunk)
但据我所知tqdm
还需要提前知道块的数量,因此对于正确的进度报告,您需要先阅读完整文件....
以下是使用 tqdm 的单行解决方案:
import pandas as pd
from tqdm import tqdm
df = pd.concat([chunk for chunk in tqdm(pd.read_csv(file_name, chunksize=1000), desc='Loading data')])
如果您知道要加载的总行数,则可以将该信息与参数total
添加到 tqdm 函数中,得到百分比 output。
免责声明:这仅适用于xlrd
引擎并且没有经过彻底测试!
这个怎么运作? 我们猴子补丁xlrd.xlsx.X12Sheet.own_process_stream
方法负责从类文件流加载工作表。 我们提供自己的流,其中包含我们的进度条。 每个工作表都有自己的进度条。
当我们想要进度条时,我们使用load_with_progressbar()
上下文管理器,然后执行pd.read_excel('<FILE.xlsx>')
。
import xlrd
from tqdm import tqdm
from io import RawIOBase
from contextlib import contextmanager
class progress_reader(RawIOBase):
def __init__(self, zf, bar):
self.bar = bar
self.zf = zf
def readinto(self, b):
n = self.zf.readinto(b)
self.bar.update(n=n)
return n
@contextmanager
def load_with_progressbar():
def my_get_sheet(self, zf, *other, **kwargs):
with tqdm(total=zf._orig_file_size) as bar:
sheet = _tmp(self, progress_reader(zf, bar), **kwargs)
return sheet
_tmp = xlrd.xlsx.X12Sheet.own_process_stream
try:
xlrd.xlsx.X12Sheet.own_process_stream = my_get_sheet
yield
finally:
xlrd.xlsx.X12Sheet.own_process_stream = _tmp
import pandas as pd
with load_with_progressbar():
df = pd.read_excel('sample2.xlsx')
print(df)
进度条截图:
这可能对有类似问题的人有所帮助。 在这里你可以获得帮助
例如:
for i in tqdm(range(0,3), ncols = 100, desc ="Loading data.."):
df=pd.read_excel("some_file.xlsx",header=None)
LC_data=pd.read_excel("some_file.xlsx",'Sheet1', header=None)
FC_data=pd.read_excel("some_file.xlsx",'Shee2', header=None)
print("------Loading is completed ------")
以下是根据网友rocksportrocker的优秀回答。
import pandas as pd
print("Info: Loading starting.")
# https://stackoverflow.com/questions/52209290
temp = [];
myCounter = 1;
myChunksize = 10000;
# https://stackoverflow.com/questions/24251219/
for myChunk in pd.read_csv('YourFileName.csv', chunksize = myChunksize, low_memory = False):
print('# of rows processed: ', myCounter*myChunksize)
myCounter = myCounter + 1;
temp.append(myChunk)
print("Info: Loading complete.")
# https://stackoverflow.com/questions/33642951
df = pd.concat(temp, ignore_index = True)
df.head()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.