큰 xlsx 파일에서 판다 DataFrame을 로드하기 위한 진행 표시줄을 만들려면 어떻게 해야 합니까?
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에서 Data Frame을 생성하도록 편집했습니다.
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의 대안으로?
어떤 도움이라도 대단히 감사합니다.
동작하지 않습니다. 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 기능에 접속하여 퍼센티지 출력을 얻을 수 있습니다.
이것은 비슷한 문제를 가진 사람들에게 도움이 될 것이다.여기서 도움을 받을 수 있다
예를 들어 다음과 같습니다.
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 ------")
면책사항: 이 기능은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)
진행률 바 스크린샷:
다음은 이용자의 암벽포트로커의 탁월한 답변에 기초하고 있습니다.
- 나는 파이썬 초보자야!
- 아래에 사용자 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()
언급URL : https://stackoverflow.com/questions/52209290/how-do-i-make-a-progress-bar-for-loading-pandas-dataframe-from-a-large-xlsx-file
'source' 카테고리의 다른 글
Windows XP 이후의 Windows:창을 표시하지 않고 백그라운드에서 배치 파일을 실행하려면 어떻게 해야 합니까? (0) | 2023.04.14 |
---|---|
Excel에서 셀의 첫 번째 문자를 다른 셀과 결합하려면 어떻게 해야 합니까? (0) | 2023.04.14 |
각 행을 구분하지 않고 파일을 동일한 부분으로 분할하려면 어떻게 해야 합니까? (0) | 2023.04.14 |
콘텐츠에 대한 WPF 컨트롤 크기 (0) | 2023.04.14 |
Nullable 열을 NOT NULL(기본값)로 변경합니다. (0) | 2023.04.14 |