Search

데이터 불러오고/ 저장하기

외부 파일 읽어오기

판다스는 다양한 형태의 외부 파일을 읽어와서 데이터프레임으로 변환하는 함수를 제공한다. 반대로 데이터프레임을 다양한 유형의 파일로 저장할 수도 있다.
File Format
Reader
Writer
CSV
read_csv
to_csv
JSON
read_json
to_json
HTML
read_html
to_html
Local clipboard
reaad_clipboard
to_clipboard
MS Excel
read_excel
to_excel
HDF5 Format
read_hdf
to_hdf
SQL
read_sql
to_sql

~ CSV 파일

데이터 값을 ‘,’로 구분하고 있다는 의미로 CSV라고 부르는 텍스트 파일이다. 줄바꿈으로 행을 구분한다.
CSV파일 → 데이터프레임 : pd.read_csv(”파일경로(이름)”)
header 옵션열 이름으로 사용할 행을 지정한다. default로 1번째 행을 열로 지정한다.
index_col 옵션데이터프레임의 행 인덱스가 되는 열을 지정한다.
index_col = False : 인덱스 지정 안함
index_col = ‘열 이름’ : 인덱스 지정
옵션
설명
path
파일의 위치, 파일명 포함
sep
텍스트 데이터를 필드별로 구분하는 문자
header
열 이름으로 사용될 행의 번호(기본값은 0), header가 없고 첫 행부터 데이터가 있는 경우 None으로 지정
index_col
행 인덱스로 사용할 열의 번호 또는 열 이름
names
열 이름으로 사용할 문자열의 리스트
skiprows
처음 몇 줄을 skip할 것인지 설정(숫자 입력), skip하려는 행의 번호를 담은 리스트로 설정도 가능(ex) [1,3,5]
parse_dates
날짜 형태의 텍스트를 datetime64로 불러올 수 있음
skip_footer
마지막 몇 줄을 skip할 것인지 설정(숫자 입력)
enocoding
텍스트 인코딩 종류를 지정
# csv 파일 가져오자. 파일 이름은 df_sample.csv 다. import pandas as pd file_path = './read_csv_sample.csv' df1 = pd.read_csv(file_path) # 기본: header=True print(df1) c0 c1 c2 c3 0 0 1 4 7 1 1 2 5 8 2 2 3 6 9 # read_csv() 함수로 데이터프레임 변환. 변수 df2에 저장. header=None 옵션 df2 = pd.read_csv(file_path, header=None) # 1행으로 열 지정 안함 print(df2) 0 1 2 3 0 c0 c1 c2 c3 1 0 1 4 7 2 1 2 5 8 3 2 3 6 9 # index_col = None 옵션 df3 = pd.read_csv(file_path, index_col = None) # 기본 : index_col = None print(df3) c0 c1 c2 c3 0 0 1 4 7 1 1 2 5 8 2 2 3 6 9 # index_col = 'c0' 옵션 -> 특정 열을 인덱스 칼럼으로 지정할 수 있다 df4 = pd.read_csv(file_path, index_col = 'c0') print(df4) c1 c2 c3 c0 0 1 4 7 1 2 5 8 2 3 6 9
Python
복사
parse_dates 로 날짜/시간 데이터 파싱하기
일반적으로 날짜/시간의 데이터를 pd.read_csv 로 읽으면 텍스트로 읽게된다. 아예 불러올 때부터 형태에 맞도록 변형해서 읽어오는 방법 → parse_dates
# 1. 일이 월보다 먼저 위치할 경우 설정 pd.read_csv('date_file.csv', sep=',', names=['date','id','val'], parse_dates = ['date'], # 또는 해당 열 위치 dayfirst=True, infer_datetime_format=True) # 2. 일이 월보다 뒤에 위치하는 경우(default) : dayfirst=False # 3. 수동으로 함수 형태 지정해주기 : date_parser = Parser from datetime import datetime dt_parser = lambda x : datetime.strptime(x, '%d/%m/%Y %H:%M:%S') pd.read_csv('date_sample', sep=',', names=['date','id','val'], parse_dates=['date'], date_parser=dt_parser)
Python
복사

~ Excel 파일

엑셀 파일(확장자 .xlsx) 의 행과 열은 데이터프레임의 행, 열로 일대일 대응된다.
read_excel() 함수이고 read_csv()함수와 사용법은 비슷하다. header, index_col 등 대부분의 옵션을 그대로 사용할 수 있다.
excel 파일 → 데이터프레임 :pd.read_excel(”파일 경로(이름)”)
실행환경에 따라 엑셀 파일 데이터 추출을 지원하는 xlrd 라이브러리와 openpyxl라이브러리 설치가 필요할 수도 있다. 확장자가 xlsx인 경우에는 engine옵션에 ‘openpyxl’ 를 지정하고 확장자가 xls인 경우에는 ‘xlrd’ 를 지정해준다.
엑셀 파일에 sheet가 여러개라면 sheet_name 을 지정해줘야 오류가 발생하지 않는다. (sheet 는 0부터 센다)
import pandas as pd ##################### excel 파일 데이터프레임으로 가져오기 ######################## # read_excel() 함수로 데이터프레임 변환 df1 = pd.read_excel('./남북한발전전력량.xlsx',engine='openpyxl') # header=0 옵션 df2 = pd.read_excel('./남북한발전전력량.xlsx',engine = 'openpyxl',header=None) # header 옵션 미적용 # 데이터프레임 출력 print(df1) 전력량 (억㎾h) 발전 전력별 1990 1991 1992 1993 ... 2011 2012 2013 2014 2015 2016 0 남한 합계 1077 1186 1310 1444 ... 4969 5096 5171 5220 5281 5404 1 NaN 수력 64 51 49 60 ... 78 77 84 78 58 66 2 NaN 화력 484 573 696 803 ... 3343 3430 3581 3427 3402 3523 3 NaN 원자력 529 563 565 581 ... 1547 1503 1388 1564 1648 1620 4 NaN 신재생 - - - - ... - 86 118 151 173 195 5 북한 합계 277 263 247 221 ... 211 215 221 216 190 239 6 NaN 수력 156 150 142 133 ... 132 135 139 130 100 128 7 NaN 화력 121 113 105 88 ... 79 80 82 86 90 111 8 NaN 원자력 - - - - ... - - - - - - [9 rows x 29 columns] print('\n') print(df2) 0 1 2 3 4 ... 24 25 26 27 28 0 전력량 (억㎾h) 발전 전력별 1990 1991 1992 ... 2012 2013 2014 2015 2016 1 남한 합계 1077 1186 1310 ... 5096 5171 5220 5281 5404 2 NaN 수력 64 51 49 ... 77 84 78 58 66 3 NaN 화력 484 573 696 ... 3430 3581 3427 3402 3523 4 NaN 원자력 529 563 565 ... 1503 1388 1564 1648 1620 5 NaN 신재생 - - - ... 86 118 151 173 195 6 북한 합계 277 263 247 ... 215 221 216 190 239 7 NaN 수력 156 150 142 ... 135 139 130 100 128 8 NaN 화력 121 113 105 ... 80 82 86 90 111 9 NaN 원자력 - - - ... - - - - - [10 rows x 29 columns]
Python
복사

~ JSON 파일

JSON 파일( 확장자 .json) 은 데이터 공유를 목적으로 개발된 특수한 파일 형식이다. 파이썬 딕셔너리와 비슷하게 ‘key : value’ 구조를 갖는데, 구조가 중첩되는 방식에 따라 다르게 적용한다.
JSON파일 → 데이터프레임 : pd. read_json(”파일 경로(이름)”)
JSON파일에는 주요 파이썬 패키지의 출시년도, 개발자, 오픈소스 정보가 들어있다.
##################### JSON 파일 데이터프레임으로 가져오기 ######################## # read_json () 함수로 데이터프레임 변환 df = pd.read_json('./read_json_sample.json') print(df) print('\n') print(df.index)
Python
복사

웹에서 가져오기

~ HTML 웹 페이지에서 표 속성 가져오기

판다스의 read_html() 함수는 HTML 웹 페이지에 있는 <table> 태그에서 표 형식의 데이터를 모두 찾아서 데이터프레임으로 변환한다.
표 데이터들은 각각 별도의 데이터프레임으로 변환되기 때문에 여러 개의 데이터프레임을 원소로 갖는 리스트가 반환된다.
HTML 웹페이지의 주소를 따옴표안에 입력한다. 예를들면 pd.read_html(’http://www.naver.com/’) 과 같이 입력한다.
HTML 표 속성 읽기 : pd.read_html(”웹 주소(URL) 또는 “HTML 파일 경로(이름)” )
#################### 웹에서 가져오기 ######################## # 웹 페이지 대신 html의 파일을 가져온다. url = './sample.html' # HTML 웹페이지의 표를 가져와서 데이터프레임으로 변환 tables = pd.read_html(url) # 표의 개수 확인 print(len(tables)) print('\n') 2 tables [ Unnamed: 0 c0 c1 c2 c3 0 0 0 1 4 7 1 1 1 2 5 8 2 2 2 3 6 9, name year developer opensource 0 NumPy 2006 Travis Oliphant True 1 matplotlib 2003 John D. Hunter True 2 pandas 2008 Wes Mckinneye True] # tables 리스트의 원소를 iteration하면서 각각 화면 출력 for i in range(len(tables)): print("tables[%s]" %i) # %s 자리에 i값 집어넣기 print(tables[i]) print('\n') tables[0] Unnamed: 0 c0 c1 c2 c3 0 0 0 1 4 7 1 1 1 2 5 8 2 2 2 3 6 9 tables[1] name year developer opensource 0 NumPy 2006 Travis Oliphant True 1 matplotlib 2003 John D. Hunter True 2 pandas 2008 Wes Mckinneye True # 파이썬 패키지 정보가 들어 있는 두 번째 데이터프레임을 선택하여 df 변수에 저장 df = tables[1] # 'name'열을 인덱스로 저장 df.set_index('name', inplace=True) print(df)
Python
복사

~ 웹 스크래핑

BeautifulSoup 등 웹 스크래핑 도구로 수집한 데이터를 판다스 데이터프레임으로 정리하는 방법을 설명한다. 먼저 스크래핑한 내용을 리스트, 딕셔너리 등으로 정리한 뒤 DataFrame() 함수에 리스트나 딕셔너리 형태로 전달하여 데이터프레임으로 변환한다.
미국 ETF 리스트를 위키피디아에서 가져와보자.
#################### 웹 스크래핑 ######################## # 라이브러리 불러오기 from bs4 import BeautifulSoup import requests import re # 위키피디아 미국 ETF 웹 페이지에서 필요한 정보를 스크래핑하여 딕셔너리 형태로 변수 etfs에 저장 url = "https://en.wikipedia.org/wiki/List_of_American_exchange-traded_funds" resp = requests.get(url) soup = BeautifulSoup(resp.text, 'lxml') # 파서 종류인데 기본인 html파서보다 빠름 rows = soup.select('div > ul > li')# 상위태그 > 하위태그 > 하위태그 > ... etfs = {} # 빈 딕셔너리 생성 for row in rows: try: # 오류가 잠재된 일반적인 코드를 넣는 부분 etf_name = re.findall('^(.*) \(NYSE', row.text) etf_market = re.findall('\((.*)\|', row.text) etf_ticker = re.findall('NYSE Arca\|(.*)\)', row.text) if (len(etf_ticker)>0) & (len(etf_market)>0) & (len(etf_name)>0) : etfs[etf_ticker[0]] = [etf_market[0], etf_name[0]] # 리스트를 원소로 갖는 딕셔너리를 # 정의하는 방법 except AttributeError as err : # 오류 발생시 실행되는 코드를 넣는 부분 pass # etfs 딕셔너리 출력 print(etfs) print('\n') # etfs 딕셔너리를 데이터프레임으로 변환 df = pd.DataFrame(etfs) print(df)
Python
복사

API를 활용하여 데이터 수집하기

인터넷 서비스 업체에서 제공하는 API를 통해서 수집한 데이터를 판다스 자료구조로 변환하는 방법을 살펴보자. 대부분의 API는 판다스에서 쉽게 읽어올 수 있는 파일 형식(csv, json, xml, ...)을 지원한다. 따라서 데이터프레임으로 쉽게 변환할 수 있다.
사용자의 API키는 외부에 유출되지 않게 관리에 유의해야한다.
파이썬 환경에서 구글 지오코딩을 사용하기 위해서는 아나콘다 배포판에 googlemaps 라이브러리를 설치해야 한다.
아나콘다 프롬프트를 실행시킨 후 conda install -c conda-forge googlemaps 를 입력한다.
구글 지오코딩에 들어가서 API를 발급 받는다. (https://cloud.google.com/maps-platform/places/?hl=ko 에 접속)
API키를 발급받았다면 이제 아래 코드를실행한다.
## google 지오코딩 API를 통해 위도, 경도 데이터 가져오기 # 라이브러리 가져오기 import googlemaps import pandas as pd my_key = "AIzaSyDrCsyu3dHUCuY2Ik8MQni2M01w8rbb4m8" # 발급받은 api키 lat = [] # 위도 lng = [] # 경도 # 장소(또는 주소) 리스트 places = ["서울시청","국립국악원","해운대해수욕장"] i=0 for place in places: i = i+1 try:#오류가 잠재된 일반적인 코드를 프로그래밍 print(i, place) # 지오코딩 API 결과값 호출하여 geo_location 변수에 저장 geo_location = maps.geocode(place)[0].get('geometry') lat.append(geo_location['location']['lat']) lng.append(geo_location['location']['lng']) except: # 오류가 발생시 실행될 코드 lat.append('') lng.append('') print(i) # 데이터프레임으로 변환하기 df = pd.DataFrame({'위도':lat, '경도':lng}, index=places) print('\n') print(df)
Python
복사
데이터분석과 머신러닝을 공부할 때 데이터셋을 제공하는 곳은 아래와 같다.
1.
사이킷런, 시본 등 파이썬 라이브러리 제공 데이터셋
2.
캐글
3.
UCI 머신러닝 저장소
4.
공공 데이터

데이터 저장하기

~CSV 파일로 저장

데이터프레임은 2차원 배열로 구조화되어있기때문에 CSV파일로 변환할 수 있다. 데이터프레임을 CSV파일로 저장하려면 to_csv() 메소드를 적용한다.
저장할 파일 경로와 파일명을 따옴표안에 입력한다.
csv 파일로 저장 : df.to_csv(”파일 이름(경로)”)
# 판다스의 DataFrame()함수로 데이터프레임 변환. 변수 df에 저장 data = {'name': ['Jerry','Riah','Paul'], 'algol':["A", "A+", "B"], 'basic':["C", "B", "B+"], 'c++':["B+", "C", "C+"], } df = pd.DataFrame(data) df.set_index('name', inplace=True) print(df) algol basic c++ name Jerry A C B+ Riah A+ B C Paul B B+ C+ # to_csv()메소드를 사용해서 csv파일로 내보내기. 파일명은 df_sample.csv로 저장 df.to_csv("./df_sample.csv")
Python
복사

~JSON 파일로 저장

to_json()메소드를 이용한다.
JSON 파일로 저장 : df.to_json(”파일 이름(경로)”)
# to_json()메소드를 사용해서 JSON파일로 내보내기. 파일명은 df_sample.json 로 저장 df.to_json("./df_sample.json")
Python
복사

~ Excel파일로 저장

to_excel()메소드를 이용한다. 단, 사용하려면 openpyxl 라이브러리를 사전에 설치해야 한다. 아나콘다 배포판에는 기본 제공되므로 설치하지 않아도 된다.
# to_excel()메소드를 사용해서 Excel파일로 내보내기. 파일명은 df_sample.xlsx로 저장 df.to_excel("./df_sample.xlsx")
Python
복사

~여러 개의 데이터프레임을 하나의 Excel파일로 저장

판다스의 ExcelWriter() 함수는 Excel워크북 객체를 생성한다. 워크북 객체는 말 그대로 Excel파일이라고 생각하면 된다.
sheet_name 옵션에 엑셀 파일의 시트 이름을 입력하여 삽입되는 시트 위치를 지정할 수 있다. 즉 같은 엑셀파일의 서로 다른 시트에 여러 데이터프레임을 구분하여 저장할 수있다.
데이터프레임 여러 개를 엑셀 파일로 저장 : pd.ExcelWriter(”파일 이름(경로)”)
data1 = {'name': ['Jerry','Riah','Paul'], 'algol':["A", "A+", "B"], 'basic':["C", "B", "B+"], 'c++':["B+", "C", "C+"], } data2 = ('c0':[1,2,3], 'c1':[4,5,6], 'c2':[7,8,9], 'c3':[10,11,12], 'c4':[13,14,15]} df1 = pd.DataFrame (data1) df1.set_index('name', inplace=True) print(df1) algol basic c++ name Jerry A C B+ Riah A+ B C Paul B B+ C+ df2 = pd.DataFrame(data2) df2.set_index('c0', inplace=True) print(df2) c1 c2 c3 c4 c0 1 4 7 10 13 2 5 8 11 14 3 6 9 12 15 # df1을 'sheet1'으로, df2를 'sheet2'로 저장(Excel 파일명은 "df_excelwriter.xlsx") writer = pd.ExcelWriter("./df_excelwriter.xlsx") # 파일먼저 생성 df1.to_excel(writer, sheet_name="sheet1") df2.to_excel(writer, sheet_name="sheet2") writer.save() # 저장
Python
복사