Python에서 pandas로 excel 파일(.xlsx, .xls)을 읽어와 DataFrame에 저장하기 위해서는 pandas.read_excel()
함수를 사용하면 된다.
첫 번째 인수에 엑셀 파일이 있는 폴더 경로 또는 URL을 지정해준다.
코드와 같은 폴더에 있는 경우 파일의 이름과 확장자명만 써줘도 됨
# python 3.9
import pandas as pd
# 읽어올 엑셀 파일 지정
filename = 'testdata.xlsx'
# 엑셀 파일 읽어 오기
df = pd.read_excel(filename, engine='openpyxl')
print(df)
참고로 예전의 파이썬 버전에서는 openpyxl 라이브러리를 함께 사용하지 않아도 작동이 잘 되었지만, 현재의 파이썬 버전에서는 openpyxl 라이브러리 없이 코드를 돌릴 경우 XLRDError: Excel xlsx file; not supported
이라는 에러가 뜨는 것을 볼 수 있다.
xlrd에서 xlsx 확장자를 읽는 기능이 파이썬 3.9 버전 이상부터는 불안정하여 해당 기능 지원이 중단된 것이라 한다. 기본적으로 제공하는 엔진은 xlrd인데 이를 8번째 줄 코드처럼 openpyxl
엔진으로 변경해주어야 한다.
기본적으로 여러 시트가 있는 엑셀 파일의 경우, 첫 시트를 불러오게 된다.
다른 시트를 불러오고 싶다면, sheet_name
을 설정해 시트를 지정할 수 있다. sheet_name
에는 시트의 인덱스 번호를 넣어도 되고, 시트의 이름을 넣어도 된다. 엑셀 시트 인덱스는 0부터 시작한다.
import pandas as pd
# 인덱스를 지정해 시트 설정
df_sheet_index = pd.read_excel('testdata.xlsx', sheet_name=1, engine='openpyxl')
print(df_sheet_index)
# Unnamed: 0 AA BB CC
# 0 ONE 11 12 13
# 1 TWO 21 22 23
# 2 THREE 31 32 33
# 시트 이름을 지정해 시트 설정
df_sheet_name = pd.read_excel('testdata.xlsx', sheet_name='sheet2', engine='openpyxl')
print(df_sheet_name)
# Unnamed: 0 AA BB CC
# 0 ONE 11 12 13
# 1 TWO 21 22 23
# 2 THREE 31 32 33
sheet_name
에 읽어 오고 싶은 시트를 리스트 형태로 지정하면 되면 여러 개의 시트를 하나의 DataFrame에 저장할 수 있다. 읽어온 데이터는 dictionary 타입으로 저장되며, sheet_name
으로 지정한 시트 인덱스 번호 또는 시트 이름이 key로 설정되고 취득한 값은 value 형태가 된다.
import pandas as pd
# 여러개 시트를 취득
df_sheet_multi = pd.read_excel('testdata.xlsx',
sheet_name=[0, 'sheet2'],
engine='openpyxl')
print(df_sheet_multi)
# {0: Unnamed: 0 A B C
# 0 one 11 12 13
# 1 two 21 22 23
# 2 three 31 32 33, 'sheet2': Unnamed: 0 AA BB CC
# 0 ONE 11 12 13
# 1 TWO 21 22 23
# 2 THREE 31 32 33}
print(type(df_sheet_multi))
# <class 'dict'>
print(len(df_sheet_multi))
# 2
print(df_sheet_multi[0])
# Unnamed: 0 A B C
# 0 one 11 12 13
# 1 two 21 22 23
# 2 three 31 32 33
print(type(df_sheet_multi[0]))
# <class 'pandas.core.frame.DataFrame'>
print(df_sheet_multi['sheet2'])
# Unnamed: 0 AA BB CC
# 0 ONE 11 12 13
# 1 TWO 21 22 23
# 2 THREE 31 32 33
print(type(df_sheet_multi['sheet2']))
# <class 'pandas.core.frame.DataFrame'>
파일에 있는 모든 시트를 불러오고 싶다면, sheet_name
을 None
으로 설정하면 된다.
마찬가지로 dictionary 형태로 저장되며 키로 데이터에 접근할 수 있다.
import pandas as pd
# 모든 시트 취득
df_sheet_all = pd.read_excel('testdata.xlsx',
sheet_name=None,
engine='openpyxl')
print(df_sheet_all)
# {'sheet1': Unnamed: 0 A B C
# 0 one 11 12 13
# 1 two 21 22 23
# 2 three 31 32 33, 'sheet2': Unnamed: 0 AA BB CC
# 0 ONE 11 12 13
# 1 TWO 21 22 23
# 2 THREE 31 32 33}
print(df_sheet_all['sheet1'])
# Unnamed: 0 A B C
# 0 one 11 12 13
# 1 two 21 22 23
# 2 three 31 32 33
print(type(df_sheet_all['sheet1']))
# <class 'pandas.core.frame.DataFrame'>
print(df_sheet_all['sheet2'])
# Unnamed: 0 AA BB CC
# 0 ONE 11 12 13
# 1 TWO 21 22 23
# 2 THREE 31 32 33
print(type(df_sheet_all['sheet2']))
# <class 'pandas.core.frame.DataFrame'>
기본적으로 엑셀에서 데이터를 취득하면 첫 번째 행이 헤더(column name)가 되고, 첫 번째 열이 인덱스로 지정된다.
취득한 데이터를 헤더와 인덱스 없이 저장하고 싶은 경우에는 hearder
와 index_col
을 None
으로 지정하면 된다.
import pandas as pd
# 헤더와 인덱스를 설정 안함
df_header_index = pd.read_excel('testdata.xlsx',
header=None,
index_col=None,
engine='openpyxl')
print(df_header_index)
# 0 1 2 3
# 0 NaN A B C
# 1 one 11 12 13
# 2 two 21 22 23
# 3 three 31 32 33
print(df_header_index.columns)
# Int64Index([0, 1, 2, 3], dtype='int64')
print(df_header_index.index)
# RangeIndex(start=0, stop=4, step=1)
내용 순서, 샘플 소스, 샘플 소스 주석까지 그대로 사용하시는데 출처로도 남겨주세요.