Pandas Read Excel: Python에서 Excel 파일 가져오는 방법
Updated on
Excel 파일은 비즈니스 환경에서 표 형식 데이터를 저장하는 가장 일반적인 형식으로 남아 있지만, 분석을 위해 Python으로 가져올 때 종종 마찰이 발생합니다. 여러 시트, 일관되지 않은 데이터 타입, 결측값, 메모리 제약을 처리해야 하며, 이 모든 것을 데이터 무결성을 유지하면서 수행해야 합니다. pandas의 read_excel() 함수는 이러한 과제를 해결하지만, 30개 이상의 매개변수를 올바르게 구성하는 방법을 알고 있을 때만 가능합니다.
이 가이드는 기본적인 단일 시트 가져오기부터 여러 시트를 동시에 읽기, 대용량 파일 처리, 일반적인 오류 문제 해결과 같은 고급 시나리오까지 Excel 파일을 pandas DataFrame으로 효율적으로 가져오는 방법을 보여줍니다.
pandas read_excel()의 기본 사용법
Excel 파일을 pandas DataFrame으로 읽는 가장 간단한 방법은 파일 경로만 필요합니다.
import pandas as pd
# Excel 파일의 첫 번째 시트 읽기
df = pd.read_excel('data.xlsx')
print(df.head())이것은 기본적으로 첫 번째 시트를 읽고 첫 번째 행을 열 헤더로 처리합니다. 함수는 파일 형식(.xlsx 또는 .xls)을 자동으로 감지하고 적절한 엔진을 사용합니다.
다른 디렉토리의 파일의 경우 절대 경로 또는 상대 경로를 사용합니다.
# 절대 경로
df = pd.read_excel('/Users/username/Documents/sales_data.xlsx')
# 상대 경로
df = pd.read_excel('../data/sales_data.xlsx')주요 매개변수 이해
read_excel() 함수는 데이터를 가져오는 방법에 대한 광범위한 제어를 제공합니다. 가장 중요한 매개변수의 참조 테이블은 다음과 같습니다.
| 매개변수 | 타입 | 설명 | 예 |
|---|---|---|---|
sheet_name | str, int, list, None | 읽을 시트 지정 | sheet_name='Sales' 또는 sheet_name=0 |
header | int, list, None | 열 이름으로 사용할 행 | header=0 (기본값) 또는 header=None |
usecols | str, list | 파싱할 열 | usecols='A:D' 또는 usecols=[0,1,2] |
dtype | dict, Type | 열의 데이터 타입 | dtype={'ID': str, 'Age': int} |
skiprows | int, list | 시작 부분에서 건너뛸 행 | skiprows=2 또는 skiprows=[0,2,5] |
nrows | int | 읽을 행 수 | nrows=1000 |
na_values | scalar, str, list, dict | NaN으로 인식할 값 | na_values=['NA', 'N/A', ''] |
parse_dates | bool, list, dict | 날짜로 파싱할 열 | parse_dates=['Date'] |
engine | str | 사용할 Excel 엔진 | engine='openpyxl' 또는 engine='xlrd' |
여러 시트 작업
특정 시트 읽기
이름 또는 인덱스(0 기반)로 시트를 지정합니다.
# 시트 이름으로 읽기
df = pd.read_excel('financial_report.xlsx', sheet_name='Q1 Revenue')
# 인덱스로 읽기 (0 = 첫 번째 시트)
df = pd.read_excel('financial_report.xlsx', sheet_name=0)한 번에 여러 시트 읽기
시트 이름 또는 인덱스의 리스트를 전달하여 여러 시트를 DataFrame의 딕셔너리로 가져옵니다.
# 여러 특정 시트 읽기
sheets_dict = pd.read_excel('annual_report.xlsx',
sheet_name=['Q1', 'Q2', 'Q3', 'Q4'])
# 개별 DataFrame에 액세스
q1_df = sheets_dict['Q1']
q2_df = sheets_dict['Q2']
print(f"Q1 shape: {q1_df.shape}")
print(f"Q2 shape: {q2_df.shape}")모든 시트 읽기
sheet_name=None을 사용하여 워크북의 모든 시트를 가져옵니다.
# 모든 시트를 딕셔너리로 읽기
all_sheets = pd.read_excel('company_data.xlsx', sheet_name=None)
# 모든 시트를 반복
for sheet_name, df in all_sheets.items():
print(f"\nSheet: {sheet_name}")
print(f"Shape: {df.shape}")
print(f"Columns: {df.columns.tolist()}")이것은 유사한 구조를 가진 여러 시트를 처리해야 할 때 특히 유용합니다.
# 모든 시트를 단일 DataFrame으로 결합
all_sheets = pd.read_excel('monthly_sales.xlsx', sheet_name=None)
combined_df = pd.concat(all_sheets.values(), ignore_index=True)
print(f"Combined shape: {combined_df.shape}")헤더 및 열로 데이터 가져오기 제어
헤더 행 지정
어떤 행이 열 이름이 될지 제어합니다.
# 처음 2개 행을 건너뛰고 3번째 행을 헤더로 사용
df = pd.read_excel('data.xlsx', header=2)
# 헤더 행 없음 - pandas는 숫자 열 이름을 할당
df = pd.read_excel('data.xlsx', header=None)
# 다중 레벨 열 헤더
df = pd.read_excel('data.xlsx', header=[0, 1])행 건너뛰기
파일 상단에서 원하지 않는 행을 제거합니다.
# 처음 3개 행 건너뛰기
df = pd.read_excel('data.xlsx', skiprows=3)
# 특정 행 건너뛰기 (0 인덱스)
df = pd.read_excel('data.xlsx', skiprows=[0, 2, 5])
# 함수를 사용하여 행 건너뛰기
df = pd.read_excel('data.xlsx', skiprows=lambda x: x % 2 == 0) # 짝수 행 건너뛰기특정 열 선택
메모리 사용량을 줄이기 위해 필요한 열만 가져옵니다.
# 문자 범위로 열 선택
df = pd.read_excel('data.xlsx', usecols='A:D')
# 문자로 특정 열 선택
df = pd.read_excel('data.xlsx', usecols='A,C,E,G')
# 인덱스로 열 선택
df = pd.read_excel('data.xlsx', usecols=[0, 2, 4, 6])
# 이름으로 열 선택
df = pd.read_excel('data.xlsx', usecols=['Name', 'Age', 'Salary'])
# 함수를 사용하여 열 선택
df = pd.read_excel('data.xlsx', usecols=lambda x: 'total' in x.lower())데이터 타입 지정 및 변환
열 데이터 타입 설정
자동 추론 오류를 방지하기 위해 데이터 타입을 명시적으로 정의합니다.
# 여러 열의 dtypes 지정
df = pd.read_excel('customer_data.xlsx',
dtype={
'CustomerID': str,
'ZipCode': str,
'Age': int,
'Revenue': float
})
# 선행 0을 유지하기 위해 숫자 ID를 문자열로 유지
df = pd.read_excel('products.xlsx', dtype={'ProductID': str})날짜 처리
날짜 열을 자동으로 파싱합니다.
# 단일 날짜 열 파싱
df = pd.read_excel('orders.xlsx', parse_dates=['OrderDate'])
# 여러 날짜 열 파싱
df = pd.read_excel('employee_data.xlsx',
parse_dates=['HireDate', 'TerminationDate'])
# 열을 단일 datetime으로 결합
df = pd.read_excel('logs.xlsx',
parse_dates={'DateTime': ['Date', 'Time']})
# 결과 확인
print(df.dtypes)결측값 관리
pandas가 결측 데이터를 식별하고 처리하는 방법을 제어합니다.
# 사용자 정의 결측값 표시자 인식
df = pd.read_excel('survey_data.xlsx',
na_values=['NA', 'N/A', 'null', 'None', '-'])
# 열별로 다른 NA 값
df = pd.read_excel('mixed_data.xlsx',
na_values={
'Age': ['Unknown', 'N/A'],
'Salary': [0, -1, 'Not Disclosed']
})
# 기본 NA 값을 유지하고 더 추가
df = pd.read_excel('data.xlsx',
na_values=['Missing'],
keep_default_na=True)대용량 Excel 파일 처리
Excel 파일은 RAM에 완전히 로드될 때 상당한 메모리를 소비합니다. 대규모 데이터 세트에는 다음 전략을 사용하세요.
행 제한
필요한 행만 읽습니다.
# 처음 10,000개 행 읽기
df = pd.read_excel('large_file.xlsx', nrows=10000)
# skiprows 및 nrows를 사용하여 특정 행 범위 읽기
df = pd.read_excel('large_file.xlsx', skiprows=1000, nrows=5000)메모리 효율성을 위한 컨버터 사용
메모리 사용량을 줄이기 위해 가져오는 동안 변환을 적용합니다.
# 읽는 동안 열 변환
def categorize_status(value):
return 'Active' if value == 1 else 'Inactive'
df = pd.read_excel('users.xlsx',
converters={
'Status': categorize_status,
'Category': lambda x: x.lower().strip()
})시트를 반복적으로 처리
여러 대형 시트가 있는 워크북의 경우 한 번에 하나의 시트를 처리합니다.
import pandas as pd
# 먼저 모든 시트 이름 가져오기
xls = pd.ExcelFile('massive_workbook.xlsx')
sheet_names = xls.sheet_names
# 각 시트를 개별적으로 처리
for sheet in sheet_names:
df = pd.read_excel(xls, sheet_name=sheet, nrows=10000)
# 여기서 df 처리
result = df.describe()
print(f"\n{sheet} Summary:\n{result}")대안: 스트리밍을 위해 openpyxl 사용
매우 큰 파일의 경우 openpyxl로 행 단위로 읽는 것을 고려하세요.
from openpyxl import load_workbook
# 읽기 전용 모드로 워크북 로드
wb = load_workbook('huge_file.xlsx', read_only=True)
ws = wb['Sheet1']
# 행을 반복적으로 처리
data = []
for row in ws.iter_rows(min_row=2, max_row=1000, values_only=True):
data.append(row)
# DataFrame으로 변환
df = pd.DataFrame(data, columns=['Col1', 'Col2', 'Col3'])
wb.close()Excel 엔진 이해
Pandas는 형식 및 설치된 패키지에 따라 다른 라이브러리를 사용하여 Excel 파일을 읽습니다.
| 엔진 | 파일 형식 | 설치 | 사용 사례 |
|---|---|---|---|
openpyxl | .xlsx | pip install openpyxl | 최신 Excel 파일(Excel 2010+), .xlsx의 기본값 |
xlrd | .xls, .xlsx | pip install xlrd | 레거시 .xls 파일(Excel 2003), .xlsx에서는 더 이상 사용되지 않음 |
pyxlsb | .xlsb | pip install pyxlsb | 바이너리 Excel 파일 |
odf | .ods | pip install odfpy | OpenDocument 스프레드시트 |
엔진을 명시적으로 지정합니다.
# openpyxl 엔진 강제
df = pd.read_excel('data.xlsx', engine='openpyxl')
# 레거시 .xls 파일 읽기
df = pd.read_excel('old_data.xls', engine='xlrd')
# 바이너리 Excel 파일 읽기
df = pd.read_excel('data.xlsb', engine='pyxlsb')Pandas read_excel vs read_csv: 주요 차이점
두 함수 모두 DataFrame을 생성하지만 중요한 차이점이 있습니다.
| 기능 | read_excel() | read_csv() |
|---|---|---|
| 파일 형식 | 바이너리 Excel 파일(.xlsx, .xls) | 일반 텍스트 CSV 파일 |
| 속도 | 느림(복잡한 형식 파싱) | 빠름(간단한 텍스트 파싱) |
| 종속성 | openpyxl/xlrd 필요 | 추가 종속성 없음 |
| 여러 시트 | 예(sheet_name 매개변수) | 아니오(단일 파일만) |
| 형식화된 데이터 | 일부 Excel 형식 보존 | 형식 없음(일반 텍스트) |
| 메모리 사용량 | 높음(바이너리 파싱 오버헤드) | 낮음(텍스트 스트리밍) |
| 수식 | 계산된 값만 읽음 | N/A |
| 날짜 파싱 | Excel 날짜 자동 변환 | parse_dates 필요 |
| 대용량 파일 | 메모리 집약적 | chunksize 매개변수 지원 |
| 적합한 용도 | 비즈니스 데이터, 다중 시트 보고서 | 대규모 데이터 세트, 데이터 내보내기 |
권장사항: 대규모 데이터 처리에는 read_csv()를 사용하고 기존 Excel 워크북 또는 여러 시트로 작업해야 하는 경우 read_excel()을 사용하세요.
PyGWalker로 Excel 데이터를 즉시 시각화
pandas로 Excel 데이터를 가져온 후 시각적으로 탐색해야 하는 경우가 많습니다. PyGWalker (opens in a new tab)는 DataFrame을 Jupyter 노트북 내에서 직접 Tableau와 유사한 대화형 시각화 인터페이스로 변환합니다. 플로팅 코드를 작성할 필요가 없습니다.
import pandas as pd
import pygwalker as pyg
# Excel 데이터 읽기
df = pd.read_excel('sales_data.xlsx')
# 대화형 시각화 시작
pyg.walk(df)이것은 다음을 수행할 수 있는 드래그 앤 드롭 인터페이스를 엽니다.
- 열을 시각적 채널로 드래그하여 차트 생성
- 차트 유형(막대, 선, 산점도, 히트맵) 간 즉시 전환
- 필터 및 집계를 대화형으로 적용
- 시각화를 이미지 또는 코드로 내보내기
PyGWalker는 Excel 파일을 가져온 후 탐색적 데이터 분석에 특히 유용하며, matplotlib 또는 seaborn 코드를 작성하지 않고도 데이터 분포 및 관계를 이해할 수 있습니다.
일반적인 오류 및 문제 해결
ModuleNotFoundError: No module named 'openpyxl'
이것은 .xlsx 파일을 읽을 때 가장 일반적인 오류입니다.
ImportError: Missing optional dependency 'openpyxl'. Use pip or conda to install openpyxl.해결책: 필요한 엔진을 설치합니다.
# openpyxl 설치
pip install openpyxl
# 또는 모든 Excel 종속성 설치
pip install pandas[excel]XLRDError: Excel xlsx file; not supported
이 오류가 표시되면 xlrd가 .xlsx 파일을 읽으려고 시도합니다(버전 2.0부터 .xls만 지원).
해결책: openpyxl을 설치하거나 엔진을 지정합니다.
df = pd.read_excel('data.xlsx', engine='openpyxl')FileNotFoundError
파일 경로 및 작업 디렉토리를 확인합니다.
import os
# 현재 디렉토리 출력
print(os.getcwd())
# 디렉토리의 파일 나열
print(os.listdir('.'))
# 절대 경로 사용
df = pd.read_excel('/absolute/path/to/file.xlsx')대용량 파일의 메모리 오류
pandas가 메모리 오류로 충돌하는 경우:
# 열을 선택하여 메모리 줄이기
df = pd.read_excel('large_file.xlsx', usecols=['A', 'B', 'C'])
# 행 제한
df = pd.read_excel('large_file.xlsx', nrows=50000)
# dtypes를 지정하여 메모리 줄이기
df = pd.read_excel('large_file.xlsx',
dtype={'ID': 'int32', 'Category': 'category'})ValueError: Excel file format cannot be determined
이것은 파일 확장자가 실제 형식과 일치하지 않을 때 발생합니다.
해결책: 엔진을 명시적으로 지정하거나 올바른 확장자로 파일 이름을 변경합니다.
# 다른 엔진 시도
df = pd.read_excel('data.xlsx', engine='openpyxl')날짜 파싱 문제
Excel은 날짜를 일련 번호로 저장합니다. 날짜가 올바르게 파싱되지 않는 경우:
# 날짜 파싱 강제
df = pd.read_excel('data.xlsx', parse_dates=['DateColumn'])
# 수동 변환
df['DateColumn'] = pd.to_datetime(df['DateColumn'])고급 기술
암호로 보호된 파일 읽기
pandas는 암호로 보호된 파일을 직접 지원하지 않지만 msoffcrypto-tool을 사용합니다.
import msoffcrypto
import io
import pandas as pd
# 파일 암호 해독
decrypted = io.BytesIO()
with open('protected.xlsx', 'rb') as f:
file = msoffcrypto.OfficeFile(f)
file.load_key(password='yourpassword')
file.decrypt(decrypted)
# 암호 해독된 파일 읽기
df = pd.read_excel(decrypted)read_excel을 컨텍스트 관리자와 결합
더 나은 리소스 관리를 위해:
from contextlib import closing
import pandas as pd
with closing(pd.ExcelFile('data.xlsx')) as xls:
df1 = pd.read_excel(xls, sheet_name='Sheet1')
df2 = pd.read_excel(xls, sheet_name='Sheet2')
# 이 블록 후 파일이 자동으로 닫힙니다URL 작업
URL에서 직접 Excel 파일을 읽습니다.
url = 'https://example.com/data.xlsx'
df = pd.read_excel(url)Excel 데이터 디버깅을 위한 RunCell 사용
Jupyter 노트북에서 복잡한 Excel 가져오기로 작업할 때 RunCell (opens in a new tab)은 가져오기 오류 디버깅, 매개변수 최적화, 데이터 타입 문제 수정을 위한 AI 기반 지원을 제공합니다. AI 에이전트는 다음을 수행할 수 있습니다.
read_excel()이 날짜를 올바르게 파싱하지 않는 이유 진단- 메모리 효율성을 위한 최적의
dtype사양 제안 - 엔진 호환성 문제 디버그
- 인코딩 및 형식 문제 해결 지원
이것은 일관되지 않은 형식 또는 복잡한 다중 시트 구조를 가진 실제 Excel 파일을 가져올 때 특히 유용합니다.
FAQ
pandas에서 헤더 없이 Excel 파일을 읽는 방법은 무엇입니까?
header=None을 설정하여 첫 번째 행이 열 이름이 아닌 데이터임을 pandas에 알립니다. Pandas는 숫자 열 이름(0, 1, 2...)을 할당합니다.
df = pd.read_excel('data.xlsx', header=None)그런 다음 수동으로 열 이름을 변경할 수 있습니다.
df.columns = ['Name', 'Age', 'Salary']pandas는 한 번에 여러 Excel 파일을 읽을 수 있습니까?
예, 루프 또는 리스트 컴프리헨션을 사용하여 여러 파일을 읽고 연결합니다.
import pandas as pd
from glob import glob
# 디렉토리의 모든 Excel 파일 읽기
files = glob('data/*.xlsx')
dfs = [pd.read_excel(f) for f in files]
combined_df = pd.concat(dfs, ignore_index=True)Excel 파일에서 특정 행만 읽는 방법은 무엇입니까?
skiprows 및 nrows 매개변수를 결합합니다.
# 행 100-199 읽기(처음 100개를 건너뛰고 다음 100개 읽기)
df = pd.read_excel('data.xlsx', skiprows=100, nrows=100)read_excel이 read_csv에 비해 왜 그렇게 느립니까?
Excel 파일은 복잡한 파싱이 필요한 바이너리 형식이지만 CSV 파일은 일반 텍스트입니다. 대규모 데이터 세트의 경우 먼저 Excel을 CSV로 변환합니다.
# 일회성 변환
df = pd.read_excel('large_file.xlsx')
df.to_csv('large_file.csv', index=False)
# 향후 읽기는 CSV 사용
df = pd.read_csv('large_file.csv') # 훨씬 빠름Excel 파일에서 병합된 셀을 처리하는 방법은 무엇입니까?
Pandas는 병합된 셀의 왼쪽 상단 값을 읽고 나머지를 NaN으로 채웁니다. 이러한 값을 전방 채우기할 수 있습니다.
df = pd.read_excel('data.xlsx')
df['MergedColumn'] = df['MergedColumn'].fillna(method='ffill')결론
pandas read_excel() 함수는 단순한 단일 시트 가져오기부터 여러 시트, 사용자 정의 데이터 타입, 대용량 파일 처리를 포함하는 복잡한 시나리오까지 Python으로 Excel 파일을 가져오는 포괄적인 제어를 제공합니다. 데이터를 효율적이고 정확하게 가져오려면 sheet_name, usecols, dtype, parse_dates, skiprows와 같은 주요 매개변수를 마스터하세요.
대부분의 워크플로우에서는 기본 pd.read_excel('file.xlsx')이면 충분하지만, 실제 비즈니스 데이터로 작업할 때는 엔진 선택, 컨버터 함수, 메모리 최적화 기술과 같은 고급 옵션을 이해하는 것이 중요해집니다. 적절한 엔진(.xlsx 파일의 경우 openpyxl)을 설치하고 더 나은 성능을 위해 대용량 Excel 파일을 CSV로 변환하는 것을 고려하세요.
데이터 가져오기를 위한 pandas, 즉각적인 시각화를 위한 PyGWalker, 디버깅을 위한 RunCell의 조합은 Python에서 Excel 데이터 분석을 위한 강력한 워크플로우를 만듭니다.