본문 바로가기
목차
파이썬

[Pandas 기초]5.Pandas 데이터 파일 입출력

by 지각생 2022. 8. 17.
728x90

 

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)
IndexIDNameAge01234
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.2 sep 옵션

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

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

data1 = pd.read_csv('data/Ch4_2_sep.txt', sep='\s+')
data1
IndexIDNameAge01234
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.3 header 옵션

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

header가 없는 File 읽기

data2 = pd.read_csv('data/Ch4_3_header.txt', sep='\s+', header = None)
data2
012301234
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.4 names 옵션

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

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

data3 = pd.read_csv('data/Ch4_3_header.txt', sep='\s+', names = ['Index', 'ID', 'Player', 'Age'])
data3
IndexIDPlayerAge01234
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.5 skiprosw 옵션

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

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

data4 = pd.read_csv("data/Ch4_4_skiprows.txt", sep='\s+', skiprows = [0,1], header = None)
data4
012301234
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.6 index_col 옵션

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

index 컬럼을 Index로 설정

data5 = pd.read_csv('data/Ch4_5_index_col.txt', index_col = 'Index')
data5
IDNameAgeIndex01234
158023 L.Messi 31
20801 CristianoRonaldo 33
190871 NeymarJr 26
193080 DeGea 27
192985 K.DeBruyne 27

4.1.1.7 nrows 옵션

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

3개의 row만 읽기

data6= pd.read_csv('data/Ch4_5_index_col.txt', nrows = 3)
data6
IndexIDNameAge012
0 158023 L.Messi 31
1 20801 CristianoRonaldo 33
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
IndexID이름나이01234
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.9 comment 옵션

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

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

data5 = pd.read_csv('data/Ch4_5_comment.txt', comment = '/')
data5
IndexIDNameAge01234
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.10 chunksize 옵션

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

2개씩 데이터 입력

TextFileReader = pd.read_csv('data/Ch4_1_fifa.csv', chunksize = 2)
next(TextFileReader)
IndexIDNameAge01
0 158023 L.Messi 31
1 20801 CristianoRonaldo 33
# 한번 더 하면 그 다음 500개 가 순서대로 출력
next(TextFileReader)
IndexIDNameAge23
2 190871 NeymarJr 26
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: 0IDNameAge01234
0 158023 L. Messi 31
7 176580 L. Suárez 31
18 192448 M. ter Stegen 26
20 189511 Sergio Busquets 29
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: 0IDNameAge01234
16 202126 H. Kane 24
31 190460 C. Eriksen 26
37 167948 H. Lloris 31
125 200104 H. Son 25
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: 0IDNameAge01234
3 193080 De Gea 27
45 195864 P. Pogba 25
47 192505 R. Lukaku 25
93 184941 A. Sánchez 29
116 211300 A. Martial 22

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

Barcelona, Tottenham, ManUTD = AllTeam.values()
Tottenham
Unnamed: 0IDNameAge01234
16 202126 H. Kane 24
31 190460 C. Eriksen 26
37 167948 H. Lloris 31
125 200104 H. Son 25
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')

 

 

출처:

https://programmerpsy.tistory.com/18

728x90

댓글