excel 如何为从大xlsx文件加载pandas DataFrame创建进度条?

hl0ma9xz  于 2023-04-13  发布在  其他
关注(0)|答案(6)|浏览(198)

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中的函数实际上是做什么的?
有没有更好的方法?也许可以替代tqdm?
任何帮助都非常感谢。

rqcrx0a6

rqcrx0a61#

在文件被读取之前,pd.read_excel块不会工作,并且没有办法从这个函数中获得有关其执行过程的信息。
它将适用于读操作,您可以按块方式执行,如

chunks = []
for chunk in pd.read_csv(..., chunksize=1000):
    update_progressbar()
    chunks.append(chunk)

但是据我所知,tqdm也需要提前知道块的数量,所以要想得到一个正确的进度报告,你需要先读完整的文件。

js81xvg6

js81xvg62#

下面是一个利用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函数中,从而获得百分比输出。

ffx8fchx

ffx8fchx3#

这可能会对有类似问题的人有所帮助。here您可以获得帮助
例如:

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 ------")
slhcrj9b

slhcrj9b4#

**免责声明:**此功能仅适用于xlrd引擎,未经全面测试!
**它是如何工作的?**我们的monkey-patch 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)

进度条截图:

rqmkfv5c

rqmkfv5c5#

  • 以下是根据用户的rocksportrocker优秀答案。*
  • 我是Python初学者!
  • 下面,请找到我的第一个版本使用用户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()

j9per5c4

j9per5c46#

这是基于许多以前的回应的建议。我使用它来加载一个包含注解行(#)的大TSV。它用百分比值更新tqdm进度条。

from tqdm import tqdm
import pandas as pd

        # Get number of lines in file.
        with open(file, 'r') as fp:
            lines = len(fp.readlines())
        # Read file in chunks, updating progress bar after each chunk.
        listdf = []
        with tqdm(total=lines) as bar:
            for chunk in pd.read_csv(file,chunksize=1000,comment='#',sep='\t'):
                listdf.append(chunk)
                bar.update(chunk.shape[0])

        df = pd.concat(listdf,ignore_index=True)

相关问题