Skip to content
주제
Pandas
Pandas Read Excel: Python에서 Excel 파일 가져오는 방법

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_namestr, int, list, None읽을 시트 지정sheet_name='Sales' 또는 sheet_name=0
headerint, list, None열 이름으로 사용할 행header=0 (기본값) 또는 header=None
usecolsstr, list파싱할 열usecols='A:D' 또는 usecols=[0,1,2]
dtypedict, Type열의 데이터 타입dtype={'ID': str, 'Age': int}
skiprowsint, list시작 부분에서 건너뛸 행skiprows=2 또는 skiprows=[0,2,5]
nrowsint읽을 행 수nrows=1000
na_valuesscalar, str, list, dictNaN으로 인식할 값na_values=['NA', 'N/A', '']
parse_datesbool, list, dict날짜로 파싱할 열parse_dates=['Date']
enginestr사용할 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.xlsxpip install openpyxl최신 Excel 파일(Excel 2010+), .xlsx의 기본값
xlrd.xls, .xlsxpip install xlrd레거시 .xls 파일(Excel 2003), .xlsx에서는 더 이상 사용되지 않음
pyxlsb.xlsbpip install pyxlsb바이너리 Excel 파일
odf.odspip install odfpyOpenDocument 스프레드시트

엔진을 명시적으로 지정합니다.

# 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 파일에서 특정 행만 읽는 방법은 무엇입니까?

skiprowsnrows 매개변수를 결합합니다.

# 행 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 데이터 분석을 위한 강력한 워크플로우를 만듭니다.

📚