簡體   English   中英

如何制作從大型 xlsx 文件加載 pandas DataFrame 的進度條?

[英]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的優秀回答。

  • 我是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()

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM