Pandas 데이터 입출력

2020년 09월 27일
6

데이터 입출력

Pandas는 데이터 파일을 읽어 데이터프레임으로 만들 수 있다. 다음처럼 여러 포맷을 지원한다.

  • CSV
  • EXCEL
  • HTML
  • JSON
  • HDFS
  • SAS
  • STATA
  • SQL

이중에서 가장 단순하지만 널리 사용되는 CSV(Comma Separated Values) 포맷 입출력에 대해 살펴보자.

%%writefile 명령

샘플 데이터로 사용할 CSV 파일을 %%writefile 매직 명령으로 만들어보자.

!rm -rf sample?.*
%%writefile sample1.csv
c1, c2, c3
1, 1.11, one
2, 2.22, two
3, 3.33, three

Overwriting sample1.csv

CSV 파일 입력

import pandas as pd
pd.read_csv('sample1.csv')
indexc1c2c3
011.11one
122.22two
233.33three

위에서 읽은 데이터에는 열 인덱스는 있지만 행 인덱스 정보가 없으므로 0부터 시작하는 정수 인덱스가 자동으로 추가되었다. 만야그 위의 경우와 달리 데이터 파일에 열 인덱스 정보가 없는 경우에는 read_csv 명령의 names 인수로 설정할 수 있다.

%%writefile sample2.csv
1, 1.11, one
2, 2.22, two
3, 3.33, three

Writing sample2.csv

pd.read_csv('sample2.csv', names=['c1', 'c2', 'c3'])
indexc1c2c3
011.11one
122.22two
233.33three

만약 테이블 내의 특정한 열을 행 인덱스로 저정하고 싶으면 index_col인수를 사용한다.

pd.read_csv('sample1.csv', index_col='c1')
c1c2c3
11.11one
22.22two
33.33three

확장자가 csv가 아닌 파일 즉, 데이터를 구분하는 구분자가 쉼표(Comma)가 아니면 sep인수를 써서 구분자를 지정해준다. 예를들면 구분자의 길이가 정해지지 않은 공백인 경우 \s+ 정규식 문자열을 사용할 수 있다.

%%writefile sample3.txt
c1        c2        c3        c4
0.179181 -1.538472  1.347553  0.43381
1.024209  0.087307 -1.281997  0.49265
0.417899 -2.002308  0.255245 -1.10515

Writing sample3.txt

pd.read_table('sample3.txt', sep='\s+')
indexc1c2c3c4
00.179181-1.5384721.3475530.43381
11.0242090.087307-1.2819970.49265
20.417899-2.0023080.255245-1.10515

자료 파일중에 건너뛰어야 할 행이 있다면 skiprows 인수를 사용한다.

%%writefile sample4.txt
파일 제목: sample4.txt
데이터 포맷의 설명:
c1, c2, c3
1, 1.11, one
2, 2.22, two
3, 3.33, three

Writing sample4.txt

pd.read_csv('sample4.txt', skiprows=[0, 1])
indexc1c2c3
011.11one
122.22two
233.33three

특정한 값을 NaN으로 취급하고 싶으면 na_values인수에 NaN값으로 취급할 값을 넣는다.

%%writefile sample5.csv
c1, c2, c3
1, 1.11, one
2, , two
누락, 3.33, three

Writing sample5.csv

df = pd.read_csv('sample5.csv', na_values=['누락'])
df
indexc1c2c3
01.01.11one
12.0two
2NaN3.33three
  • names : 열인덱스명이 없는경우 지정 가능 (,names=[['c1', 'c2', 'c3']])
  • sep : 데이터 구분자 지정 (,sep='\s+')
  • skiprows : 행 건너뛰기 (,skiprows=[[0, 1]])
  • na_values : 특정값을 NaN값으로 대체 (,na_values=[['누락']])

CSV 파일 출력

df.to_csv('sample6.csv')
!cat sample6.csv  # 윈도우에서는 !type sample6.csv 명령을 사용

,c1, c2, c3
0,1.0, 1.11, one
1,2.0, , two
2,, 3.33, three

파일을 읽을때와 마찬가지로 출력할 때도 seq인수로 구분자를 바꿀 수 있다. 또 na_rep인수로 NaN 표시값을 바꿀 수도 있다.

df.to_csv('sample8.csv', na_rep='누락')
!cat sample8.csv

,c1, c2, c3
0,1.0, 1.11, one
1,2.0, , two
2,누락, 3.33, three

index, header인수를 지정하여 인덱스 및 해더 출력 여부를 저정하는 것도 가능하다.

df.index = ["a", "b", "c"]
df
indexc1c2c3
a1.01.11one
b2.0two
cNaN3.33three
df.to_csv('sample9.csv', index=False, header=False)

출처 : 데이터사이언스 스쿨(datascienceschool.net)