[Pandas] 엑셀 시트 여러개 불러오기(보다 쉬운 관리)
- Python/Pandas
- 2023. 7. 24.
시트만 다른데 매번 다시 불러야하나?
판다스에서 엑셀시트를 불러오는 방법으로 보통 read_excel(sheet_name = '시트이름')을 쓰게 되는데 이러면 시트를 부를 때마다 excel을 부르고서 sheet_name을 다르게 해서 엑셀파일 자체를 다시 읽게 됩니다.
즉, 시간소비가 많다는 것이죠. (이런 시간낭비...)
그래서 엑셀 파일을 객체로 만드는 방법을 알아냈습니다.
판다스 내에 엑셀 파일을 객체로 불러와서 시트만 불러내는 방식을 사용할 수 있더라고요. 이 방식을 사용하면 엑셀파일은 불러와있는 상태에서 시트만 선택적으로 꺼내쓰는 방식으로 바뀝니다. 시간도 절약하고 시트관리가 좀 더 용이해집니다.
엑셀 파일 객체로 불러오기(ExcelFile)
판다스에 ExcelFile이라는 메쏘드가 있습니다. 이 메쏘드는
엑셀 파일을 여는 객체를 생성하는 함수입니다. read_excel은 파일자체를 가져왔다면 ExcelFile은 파일을 불러오는 객체로 생성합니다.
그렇기 때문에 보다 빠른 속도로 엑셀 파일을 가져올 수 있습니다.
import pandas as pd
# ExcelFilep 객체 생성
excel_file = pd.ExcelFile('파일명.xlsx')
실제로 excel_file 타입을 살펴보면 객체로써만 나타납니다.
시트 불러오기
시트를 불러오겠습니다.
parse를 사용합니다.
sheet1_dataframe = excel_file.parse(sheet_name='0')
sheet2_dataframe= excel_file.parse(sheet_name'1')
잘 불러와졌다면 위와 같이 Reading이 되었다고 얘기해줍니다. (현재는 단순히 sheet만 불렀지만 제대로 부르려면 dtype이나 engine을 맞춰주는게 좋습니다. 밑에서 확인하시기 바랍니다.)
read_excel보다는 선택적으로 불러오기가 편리해집니다.
read_excel은 엑셀을 불러와서 시트를 불러오기 때문에 시간이 오래 걸립니다.
저는 주로 시트네임으로 딕셔너리로 처리를 하는데 일일히 불러와도 되고 아무튼 기호에 맞게 해주시면 됩니다. read_excel보다는 파이썬에서 시트관리를 할 수 있겠다는 느낌이 확실히 납니다.
시간 비교
똑같은 엑셀 파일을 read_excel과 ExtractFile로 불러와보겠습니다.
# 시트 네임 리스트
sheet_name_list = [0,1,2,3,4,7,8]
# ExcelFile 사용
df = pd.ExcelFile(path)
sheet_dict = {}
for sheet in sheet_name_list:
sh = df.parse(sheet_name=sheet, dtype=object, engine='xlrd', verbose=True)
sheet_dict[sheet] = sh
## read_excel 사용
sheet_dict_read_excel = {}
for i in sheet_name_list:
sheet = pd.read_excel(path,sheet_name=i)
sheet_dict_read_excel[i] = sheet
같은 엑셀파일에서 똑같은 시트를 불러오는데도 이렇게 많은 시간차이가 납니다.
제가 불러온건 총 시트를 다 더하면 약 50만 row 정도되는데 2분정도의 차이가 납니다. 몇 백만개의 빅데이터를 불러올 때 진짜 엄청나게 많이 차이날 수도 있습니다.
마치며
시트가 하나만 있다면 ExtractFile보다는 read_excel이 나을겁니다. 하지만 크기가 크거나 시트가 많다면 ExtractFile을 사용해보는게 어떨까 싶습니다.
함께 보면 좋은 글
'Python > Pandas' 카테고리의 다른 글
[파이썬] 엑셀 파일 빠르게 읽는 방법(dask, csv, xlsx) (0) | 2023.08.03 |
---|---|
[파이썬] xlsx 파일 csv로 변환하기 (0) | 2023.07.27 |
[Pandas] 내 맘대로 증가율 계산 (0) | 2023.02.06 |
[Pandas] 데이터 범주로 나누기(pd.cut(),pd.qcut()) (0) | 2023.01.01 |
[Pandas] 시리즈 데이터프레임으로 바꾸기(to_frame) (0) | 2022.11.29 |