파이썬 판다스로 엑셀(xlsx, xls) 파일을 열어 데이터를 DataFrame 형태로 취득하는 방법을 알아보겠습니다.
엑셀 파일을 읽어오기 위해서는 pandas.read_excel() 함수를 사용합니다.
데이터를 읽어올 엑셀 파일을 준비하겠습니다.
excel_sample.xlsx
엑셀 파일에는 sheet1과 sheet2 2개 시트가 있습니다.
shee1 시트에는 다음과 같은 값이 들어있습니다.
A B C
one 11 12 13
two 21 22 23
three 31 32 33
shee2 시트에는 다음과 같은 값이 들어있습니다.
AA BB CC
ONE 11 12 13
TWO 21 22 23
THREE 31 32 33
xlrd 설치
pandas.read_excel()은 내부에서 xlrd이라는 라이브러리를 사용합니다.
xlrd은 파이썬에서 엑셀 파일을 읽어오거나 쓰기를 할 때 필요한 라이브러리입니다.
xlrd가 설치되지 않았다면 엑셀파일을 읽어올 때 에러가 발생합니다.
ImportError: Missing optional dependency 'xlrd'. Install xlrd >= 1.0.0 for Excel support Use pip or conda to install xlrd.
파이참을 사용하는 경우에는 라이브러리를 검색해 추가를 하면 됩니다.
커맨드로 인스톨하는 경우에는 pip를 사용합니다.
$ pip install xlrd
환경에 따라 pip3를 사용해야 하는 경우도 있습니다.
read_excel() 사용 방법
첫 번째 인수에는 엑셀 파일이 있는 폴더 경로 또는 URL을 지정합니다.
엑셀파일에 여러개 시트가 있는 경우에는 첫 번째 시트만 DataFrame에 저장됩니다.
샘플로 만들어놓은 엑셀 파일을 읽어오겠습니다.
import pandas as pd
df = pd.read_excel('C:/Users/Administrator/Desktop/python/excel/excel_sample.xlsx')
print(df)
결과
Unnamed: 0 A B C
0 one 11 12 13
1 two 21 22 23
2 three 31 32 33
확장자가 xls인 엑셀파일도 사용 방법은 같습니다.
엑셀 파일 시트 설정
엑셀 파일에 시트가 여러개인 경우 sheet_name을 설정해 시트를 지정할 수 있습니다.
sheet_name에는 인덱스를 지정하거나 시트 이름을 지정합니다.
엑셀 시트 인덱스는 0부터 시작합니다.
import pandas as pd
# 인덱스를 지정해 시트 설정
df_sheet_index = pd.read_excel('C:/Users/Administrator/Desktop/python/excel/excel_sample.xlsx', sheet_name=1)
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('C:/Users/Administrator/Desktop/python/excel/excel_sample.xlsx', sheet_name='sheet2')
print(df_sheet_name)
# Unnamed: 0 AA BB CC
# 0 ONE 11 12 13
# 1 TWO 21 22 23
# 2 THREE 31 32 33
시트가 여러개인 경우 하나의 DataFrame에 모두 저장하고 싶은 경우가 있습니다.
sheet_name에 데이터를 가지고 오고 싶은 시트를 리스트 형태로 지정합니다.
sheet_name에 리스트를 지정하는 경우 인덱스 또는 시트 이름을 리스트 형태로 설정할 수 있습니다.
import pandas as pd
# 여러개 시트를 취득
df_sheet_multi = pd.read_excel('C:/Users/Administrator/Desktop/python/excel/excel_sample.xlsx', sheet_name=[0, 'sheet2'])
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
sheet_name에 리스트 형태로 지정한 경우에는 sheet_name 지정한 인덱스 번호 또는 시트 이름이 DataFrame 키(key)로 설정됩니다.
그리고 취득한 값은 value 형태가 됩니다.
타입을 확인해보면 키와 값으로 만들어진 dict인 것을 알 수 있습니다.
여러개 시트를 취득해 키와 값으로 저장했기 때문에 키로 접근할 수 있습니다.
import pandas as pd
# 여러개 시트를 취득
df_sheet_multi = pd.read_excel('C:/Users/Administrator/Desktop/python/excel/excel_sample.xlsx', sheet_name=[0, 'sheet2'])
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으로 설정합니다.
import pandas as pd
# 모든 시트 취득
df_sheet_all = pd.read_excel('C:/Users/Administrator/Desktop/python/excel/excel_sample.xlsx', sheet_name=None)
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}
취득한 모든 시트는 키와 값으로 저장됩니다.
키에는 시트 이름이 설정되고 값에는 시트 안에 있던 데이터가 저장됩니다.
엑셀에서 읽어와 저장한 데이터는 키로 접근할 수 있습니다.
import pandas as pd
# 모든 시트 취득
df_sheet_all = pd.read_excel('C:/Users/Administrator/Desktop/python/excel/excel_sample.xlsx', sheet_name=None)
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'>
헤더, 인덱스 설정
엑셀 파일을 읽어올 때 헤더와 인덱스를 설정할 수 있습니다.
기본적으로 엑셀에서 데이터를 취득하면 첫 번째 행이 헤더(컬럼 이름)가 되고, 첫 번째 열이 인덱스로 지정이 됩니다.
취득한 데이터를 헤더와 인덱스 없이 저장하고 싶은 경우에는 header와 index_col을 None으로 지정합니다.
import pandas as pd
# 헤더와 인덱스를 설정 안함
df_header_index = pd.read_excel('C:/Users/Administrator/Desktop/python/excel/excel_sample.xlsx', header=None, index_col=None)
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)
read_excel를 사용해 엑셀 파일을 읽어오는 방법을 확인했습니다.
댓글