반응형

안녕하세요. PSYda입니다.

이번 포스팅에서는 Pandas 데이터의 파일 입출력 방법에 대해 알아보겠습니다.

실습에 필요한 파일은 아래에서 다운로드 받을 수 있습니다.

data.zip
다운로드

소개할 내용은 아래와 같습니다.

  • 텍스트 파일 입력을 위한 read_csv 함수 소개
  • 엑셀 파일 입력을 위한 read_excel 함수 소개
  • DataFrame의 텍스트 파일 출력을 위한 to_csv 함수 소개
  • DataFrame의 엑셀 파일 출력을 위한 to_excel 함수 소개

4. Pandas 파일 입출력

Pandas로 입출력 할 수 있는 파일 포맷은 매우 다양하지만 대표적으로 아래와 같습니다.

  • CSV, Excel, HTML, JSON 등

이번에는 CSV 및 Excel File을 입출력하는 방법을 알아보겠습니다.

예제에 사용하기 위한 데이터를 확보하기 위해 kaggle에서 fifa19 선수 Dataset을 다운로드 받았으며, 실습에 사용하기 위해 변형하였습니다.

4.1 파일 입력

4.1.1 (구분자가 있는)텍스트 파일 및 CSV 파일 읽기

Pandas에서 read_csv 함수를 이용하여 텍스트 파일 및 CSV 파일을 읽을 수 있으며, 읽은 데이터는 DataFrame형태로 저장됩니다.
read_csv 함수 사용법은 아래와 같습니다.

pd.read_csv(FilePath, sep, header, names, index_col, skiprows, nrows, encoding, comment, chunksize)

  • FilePath : 읽을 파일 Path, URL 도 가능
  • sep : 구분자 입력, Default 는 쉼표(',')
  • header : 파일의 데이터에 header가 없을 경우 none 입력, Default는 header 읽음
  • names : 파일의 데이터에 header가 없을 경우에 명시적으로 컬럼명 입력 가능
  • skiprows : 입력한 개수 만큼 파일에서 행을 건너뛰고 읽음
  • index_col : 명시한 특정 컬럼을 index로 사용
  • nrows : 파일 최상위에서부터 입력한 개수만큼의 데이터만 읽음
  • encoding : 파일의 문자 인코딩 타입 입력, 한글이면 'CP949'
  • comment : 특정 문자는 주석으로 간주하고 읽지 않음
  • chunksize : TextFileReader가 입력받을 데이터 개수 Return하여 특정 개수 만큼 순서대로 읽음(뒤에 예시 참고)

pandas libary를 import

import pandas as pd
from pandas import Series, DataFrame

4.1.1.1 read_csv(별도 옵션 없이)

  • 일반 text 파일 또는 csv을 읽어서 DataFrame에 저장
  • 쉼표(',')를 기준으로 Data를 나누고 읽음

별도의 설정 없이 csv File 읽기

fifa19Player = pd.read_csv("data/Ch4_1_fifa.csv")
fifa19Player.head(5)

Index ID Name Age
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27
4 4 192985 K.DeBruyne 27

4.1.1.2 sep 옵션

  • 공백, 탭, 다른 기호 등으로 데이터가 분리된 파일일 경우 사용
  • 공백의 경우 정규식 '\s+' 을 사용함(공백이 하나 이상 발생한 경우 구분하는 정규식)

구분자를 공백으로 주고 csv File 읽기

data1 = pd.read_csv('data/Ch4_2_sep.txt', sep='\s+')
data1

Index ID Name Age
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27
4 4 192985 K.DeBruyne 27

4.1.1.3 header 옵션

  • Default 값은 첫 행을 Header로 간주
  • 첫 행이 Header가 아닐 경우 None 을 입력해주면, 첫 행도 데이터로 저장
  • 왼쪽부터 0부터 순서대로 컬럼명 부여

header가 없는 File 읽기

data2 = pd.read_csv('data/Ch4_3_header.txt', sep='\s+', header = None)
data2

0 1 2 3
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27
4 4 192985 K.DeBruyne 27

4.1.1.4 names 옵션

  • 첫 행이 Header가 아닐 경우 명시적으로 컬럼명 입력 가능

header가 없응 File 읽을 때 컬럼명 명시

data3 = pd.read_csv('data/Ch4_3_header.txt', sep='\s+', names = ['Index', 'ID', 'Player', 'Age'])
data3

Index ID Player Age
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27
4 4 192985 K.DeBruyne 27

4.1.1.5 skiprosw 옵션

  • 읽고 싶지 않은 행(MetaData 등)을 제외 할 수 있음
  • 특정 행을 읽는데 에러가 생기는 경우 제외 할 수 있음

특정 행을 제외하고 파일 읽기

data4 = pd.read_csv("data/Ch4_4_skiprows.txt", sep='\s+', skiprows = [0,1], header = None)
data4

0 1 2 3
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27
4 4 192985 K.DeBruyne 27

4.1.1.6 index_col 옵션

  • 특정 컬럼명을 Index열로 저장

index 컬럼을 Index로 설정

data5 = pd.read_csv('data/Ch4_5_index_col.txt', index_col = 'Index')
data5

ID Name Age
Index
0 158023 L.Messi 31
1 20801 CristianoRonaldo 33
2 190871 NeymarJr 26
3 193080 DeGea 27
4 192985 K.DeBruyne 27

4.1.1.7 nrows 옵션

  • 위에서부터 입력한 개수 만큼의 데이터만 읽음
  • 데이터량이 많아 메모리에 문제가 예상될 때 사용 할 수 있음

3개의 row만 읽기

data6= pd.read_csv('data/Ch4_5_index_col.txt', nrows = 3)
data6

Index ID Name Age
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26

4.1.1.8 encoding 옵션

  • 데이터 encoding 이 맞지 않아 문자가 깨지거나 오류가 생길 때 설정
  • 한글의 경우 'CP949' 를 적용하면 깨지지 않음

CP949 encoding 적용!

data7= pd.read_csv('data/Ch4_6_encoding.txt', encoding = 'CP949')
data7

Index ID 이름 나이
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27
4 4 192985 K.DeBruyne 27

4.1.1.9 comment 옵션

  • 특정 문자가 있는 행은 주석으로 간주하고 읽지 않고 건너뜀

'/' 문자는 주석이므로 읽기 않음

data5 = pd.read_csv('data/Ch4_5_comment.txt', comment = '/')
data5

Index ID Name Age
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27
4 4 192985 K.DeBruyne 27

4.1.1.10 chunksize 옵션

  • 특정 개수만큼 순서대로 입력 받을 수 있는 TextFileReader 객체를 생성
  • next(TextFileReader객체) 구문을 이용해 특정 개수만큼 순서대로 데이터 입력
  • 데이터량이 많아서 한번에 불러올 수 없는 경우에 사용

2개씩 데이터 입력

TextFileReader = pd.read_csv('data/Ch4_1_fifa.csv', chunksize = 2)
next(TextFileReader)

Index ID Name Age
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
# 한번 더 하면 그 다음 500개 가 순서대로 출력
next(TextFileReader)

Index ID Name Age
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27

4.1.2 Excel 파일 읽기

read_excel 함수를 이용하여 excel 파일을 읽어 올 수 있으며 대부분의 옵션들은 read_csv와 동일합니다.

자주 사용되는 옵션들 위주로 알아보겠습니다.

read_excel(Path, sheet_name)

  • Path : excel 파일 경로
  • sheet_name : 읽을 Sheet name 명시

4.1.2.1 read_excel(별도 옵션 없이)

fifa = pd.read_excel('data/Ch4_9_fifa19.xlsx')
fifa

Unnamed: 0 ID Name Age
0 0 158023 L. Messi 31
1 7 176580 L. Suárez 31
2 18 192448 M. ter Stegen 26
3 20 189511 Sergio Busquets 29
4 32 189242 Coutinho 26

4.1.2.2 sheet_name

  • 명시한 Sheet name만 읽음
  • Default는 첫 번째 Sheet
  • None을 입력하면 모든 Sheet를 key = Sheetname, value = Data 로 가져옴

Tottenham sheet 읽기

Tottenham = pd.read_excel('data/Ch4_9_fifa19.xlsx', sheet_name = 'Tottenham')
Tottenham

Unnamed: 0 ID Name Age
0 16 202126 H. Kane 24
1 31 190460 C. Eriksen 26
2 37 167948 H. Lloris 31
3 125 200104 H. Son 25
4 71 184087 T. Alderweireld 29
AllTeam = pd.read_excel('data/Ch4_9_fifa19.xlsx', sheet_name = None)
AllTeam.keys()
odict_keys(['FCBarcelona', 'Tottenham', 'ManUnited'])
AllTeam['ManUnited']

Unnamed: 0 ID Name Age
0 3 193080 De Gea 27
1 45 195864 P. Pogba 25
2 47 192505 R. Lukaku 25
3 93 184941 A. Sánchez 29
4 116 211300 A. Martial 22

한번에 세 개의 팀을 저장 할 수도 있음

Barcelona, Tottenham, ManUTD = AllTeam.values()
Tottenham

Unnamed: 0 ID Name Age
0 16 202126 H. Kane 24
1 31 190460 C. Eriksen 26
2 37 167948 H. Lloris 31
3 125 200104 H. Son 25
4 71 184087 T. Alderweireld 29

4.2 파일 출력

파일 입력과 마찬가지로 Pandas는 다양한 데이터로의 출력을 지원하지만 가장 많이 사용하는 csv, excel 에 관해서만 알아보겠습니다.

4.2.1 (구분자가 있는)텍스트 파일 및 CSV 로 출력

Pandas에서는 DataFame 데이터를 to_csv 함수를 이용하여 텍스트 파일 및 CSV 파일로 출력할 수 있습니다.

to_csv도 read_csv와 비슷한 옵션들을 가지고 있기 떄문에, 옵션에 대한 설명은 넘어가도록 하겠습니다.

Tottenham.to_csv('data/Tottenham.csv')

4.2.2 Excel 로 출력

to_excel 함수를 이용해 DataFrame 데이터를 Excel 파일로 출력할 수 있습니다.

마찬가지로 옵션에 대한 설명은 넘어가도록 하겠습니다.

ManUTD.to_excel('data/ManUTD.xlsx')

위의 Jupyter notebook 내용은 여기 Github에서도 확인 할 수 있습니다.

감사합니다.

반응형

+ Recent posts