【问题标题】:How do I make a progress bar for loading pandas DataFrame from a large xlsx file?如何制作从大型 xlsx 文件加载 pandas DataFrame 的进度条?
【发布时间】:2019-02-12 00:36:27
【问题描述】:

来自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 的替代品?

非常感谢任何帮助。

【问题讨论】:

  • tqdm 正在跟踪遍历一个可迭代对象所花费的时间。要拥有状态栏,您需要了解 pandas 的支持如何将文件加载到数据框中并编写自己的代码来执行此操作(如果可能)。如果加载时间是问题,为什么不粗略估计几行长度
  • 纺车就够了吗?

标签: python excel pandas tqdm


【解决方案1】:

不会工作。 pd.read_excel 阻塞直到文件被读取,并且无法从该函数中获取有关其在执行期间的进度的信息。

它适用于您可以按块进行的读取操作,例如

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

但据我了解tqdm 还需要提前知道块的数量,因此对于正确的进度报告,您需要先阅读完整文件....

【讨论】:

  • 更新进度条()是一个函数吗?如果是,我可以用来访问它的库的名称是什么?
【解决方案2】:

这可能对有类似问题的人有所帮助。 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 ------")

【讨论】:

    【解决方案3】:

    免责声明:这仅适用于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)
    

    进度条截图:

    【讨论】:

    • 这给了我以下错误:“ZipExtFile”对象没有属性“_orig_file_size”
    【解决方案4】:

    以下是根据用户的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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 2019-11-09
      相关资源
      最近更新 更多