Pandas 데이터 입출력

@winuss · September 27, 2020 · 4 min read

데이터 입출력

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')
c1 c2 c3
0 1 1.11 one
1 2 2.22 two
2 3 3.33 three

위에서 읽은 데이터에는 열 인덱스는 있지만 행 인덱스 정보가 없으므로 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'])
c1 c2 c3
0 1 1.11 one
1 2 2.22 two
2 3 3.33 three

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

pd.read_csv('sample1.csv', index_col='c1')
c2 c3
c1
1 1.11 one
2 2.22 two
3 3.33 three

확장자가 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+')
c1 c2 c3 c4
0 0.179181 -1.538472 1.347553 0.43381
1 1.024209 0.087307 -1.281997 0.49265
2 0.417899 -2.002308 0.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])
c1 c2 c3
0 1 1.11 one
1 2 2.22 two
2 3 3.33 three

특정한 값을 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
c1 c2 c3
0 1.0 1.11 one
1 2.0 two
2 NaN 3.33 three
  • names : 열인덱스명이 없는경우 지정 가능 (,names=[['c1', 'c2', 'c3']])
  • sep : 데이터 구분자 지정 (,sep='\s+')
  • skiprows : 행 건너뛰기 (,skiprows=[[0, 1]])
  • navalues : 특정값을 NaN값으로 대체 (,navalues=[['누락']])

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
c1 c2 c3
a 1.0 1.11 one
b 2.0 two
c NaN 3.33 three
df.to_csv('sample9.csv', index=False, header=False)

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

@winuss
Hello :) Developer notes!