Pandas With Excel

Page content

강의 홍보

I. Overview

이번 포스트는 기존의 엑셀 사용자를 위해 준비했다. 엑셀에 익숙한 사람들에게 파이썬을 분석 용도로 사용하고자 하는 분들에게는 작은 도움이 되기를 바란다.

II. 데이터 입출력

판다스는 다양한 형태의 외부 파일을 읽을 수 있다. CSV, MS Excel, SQL, HDF5 Format과 같은 파일 포맷을 읽을 수 있다. 파일 포맷(File Format)에 따른 데이터 입출력 도구에 관한 자료를 요약하면 다음과 같다.

파일 포맷 How to Read? How to Write?
CSV read_csv to_csv
MS Excel read_excel to_excel
SQL read_sql to_sql

그 외에 HTML, JSON, SAS 포맷과 같은 파일을 읽어오는 다양한 방법에 대해서는 Pandas 공식문서(PDF 다운로드)를 참조하기를 바란다.

III. Excel 파일

판다스 공식문서(version 1.0.3, Release date: March 18, 2020)에 따르면, read_excel() 함수는 Excel 2003(.xls), Excel 2007+(.xlsx) 파일을 읽어올 수 있다. 또한, Binary Excel(.xlsb) (한번도 본적은 없다!)도 읽을 수 있다고 하니, 90년대 엑셀 파일이 아니면, 모두 읽기가 가능한 듯 하다 (p. 286 참조).

(1) 파일 읽어오기

read_excel()to_excel() 함수는 파이썬의 xlrd, openpyxl, pyxlsb과 같은 모듈이 선행적으로 설치가 되어야 사용할 수 있기 때문에 만약, 함수 실행시 에러(error)가 발생하면 참조하기를 바란다.

  • 함수 사용 예제
data = pandas.read_excel('파일 경로(이름)')

위와 같은 형태로 소스코드를 작성하면 된다.

import pandas as pd

url = 'https://github.com/chloevan/datasets/raw/master/sports/games_plays.xlsx'
games = pd.read_excel(url)
print(games.head())
   Unnamed: 0      GameId HomeTeamAbbr VisitorTeamAbbr  Week  \
0           0  2017090700           NE              KC     1   
1           1  2017090700           NE              KC     1   
2           2  2017090700           NE              KC     1   
3           3  2017090700           NE              KC     1   
4           4  2017090700           NE              KC     1   

            Stadium        Location StadiumType        Turf     GameWeather  \
0  Gillette Stadium  Foxborough, MA     Outdoor  Field Turf  Clear and warm   
1  Gillette Stadium  Foxborough, MA     Outdoor  Field Turf  Clear and warm   
2  Gillette Stadium  Foxborough, MA     Outdoor  Field Turf  Clear and warm   
3  Gillette Stadium  Foxborough, MA     Outdoor  Field Turf  Clear and warm   
4  Gillette Stadium  Foxborough, MA     Outdoor  Field Turf  Clear and warm   

   Temperature  Humidity          PlayId  YardLine  Quarter GameClock  \
0         63.0      77.0  20170907000118        35        1  14:14:00   
1         63.0      77.0  20170907000139        43        1  13:52:00   
2         63.0      77.0  20170907000189        35        1  13:02:00   
3         63.0      77.0  20170907000345         2        1  12:12:00   
4         63.0      77.0  20170907000395        25        1  12:08:00   

  PossessionTeam  Down  Distance FieldPosition  
0             NE     3         2            NE  
1             NE     1        10            NE  
2             NE     1        10            KC  
3             NE     2         2            KC  
4             KC     1        10            KC  

위 코드로 데이터가 정상적으로 업로드 된 것을 확인 할 수 있다. 기존 엑셀 파일에 있는 Column명을 그대로 사용하고자 한다면, read_excel(파일명, header = 0) 사용하거나, read_excel(header, header = None)을 사용하면 Column명 대신에 숫자로 순차적으로 표시되게 된다. 그리고, Column명은 첫번째 행에 입력되게 된다.

url = 'https://github.com/chloevan/datasets/raw/master/sports/games_plays.xlsx'
games2 = pd.read_excel(url, header = None)

print(games2.head())
    0           1             2                3     4                 5   \
0  NaN      GameId  HomeTeamAbbr  VisitorTeamAbbr  Week           Stadium   
1  0.0  2017090700            NE               KC     1  Gillette Stadium   
2  1.0  2017090700            NE               KC     1  Gillette Stadium   
3  2.0  2017090700            NE               KC     1  Gillette Stadium   
4  3.0  2017090700            NE               KC     1  Gillette Stadium   

               6            7           8               9            10  \
0        Location  StadiumType        Turf     GameWeather  Temperature   
1  Foxborough, MA      Outdoor  Field Turf  Clear and warm           63   
2  Foxborough, MA      Outdoor  Field Turf  Clear and warm           63   
3  Foxborough, MA      Outdoor  Field Turf  Clear and warm           63   
4  Foxborough, MA      Outdoor  Field Turf  Clear and warm           63   

         11              12        13       14         15              16  \
0  Humidity          PlayId  YardLine  Quarter  GameClock  PossessionTeam   
1        77  20170907000118        35        1   14:14:00              NE   
2        77  20170907000139        43        1   13:52:00              NE   
3        77  20170907000189        35        1   13:02:00              NE   
4        77  20170907000345         2        1   12:12:00              NE   

     17        18             19  
0  Down  Distance  FieldPosition  
1     3         2             NE  
2     1        10             NE  
3     1        10             KC  
4     2         2             KC  

(2) 파일 저장하기

불러온 파일을 저장하는 방법은 여러가지 있다. 여기서는 고민해야 한다. Excel 파일로 재 저장 할 것인지, CSV 파일로 저장할 것인지, JSON 파일로 저장할 것인지에 따라 지정하면 된다.

  • 함수 사용 예제
data.to_excel('파일경로')

이렇게 작성하면 된다. 간혹 ModuleNotFoundError: No module named 'openpyxl'과 같은 에러 메시지가 뜨면, 이는 to_excel() 실행시 필요한 openpyxl 모듈이 사전에 설치가 되지 않은 것이기 때문에 터미널에서 추가 설치를 진행하면 된다.

모듈 설치 방법은 아래와 같은 형태로 실행한다.

$ pip3 install openpyxl

아나콘다 배포판에는 openpyxl 라이브러리가 기본 제공되므로 설치하지 않아도 되지만, 혹시나 에러가 발생하면 conda install openpyxl 명령어를 실행한다.

games.to_excel('example.xlsx')
%%bash
ls
example.xlsx

이제 중요한 작업이 남았다. 실무에서는 보통 여러 형태의 엑셀이 중복적으로 존재하게 된다. 매월00보고서가 엑셀 형태로 남아 있는 경우가 많은데, 복수의 엑셀파일이 존재할 시, 어떻게 효과적으로 엑셀 데이터를 불러올지 고민할 수 밖에 없다. 다음 장에서 다루도록 하겠다.

IV. Reference

Wes McKinney and Pandas Development Team¶. Pandas: Powerful Python data analysis toolkit Release 1.0.3. Retrieved March 18, 2020, from https://pandas.pydata.org/docs/pandas.pdf