[Python pandas] excel 파일 읽기: read_excel()

hwwwa·2022년 1월 5일
0

🐼 Python

목록 보기
1/18
post-custom-banner

Python에서 pandas로 excel 파일(.xlsx, .xls)을 읽어와 DataFrame에 저장하기 위해서는 pandas.read_excel() 함수를 사용하면 된다.

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_nameNone으로 설정하면 된다.

마찬가지로 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)가 되고, 첫 번째 열이 인덱스로 지정된다.

취득한 데이터를 헤더와 인덱스 없이 저장하고 싶은 경우에는 hearderindex_colNone으로 지정하면 된다.

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)
post-custom-banner

1개의 댓글

comment-user-thumbnail
2022년 6월 10일

내용 순서, 샘플 소스, 샘플 소스 주석까지 그대로 사용하시는데 출처로도 남겨주세요.

답글 달기