[Python] 데이터 사이언스 스쿨 - 4.2 데이터 입출력

Updated:

데이터 사이언스 스쿨 자료를 토대로 공부한 내용입니다.

실습과정에서 필요에 따라 내용의 누락 및 추가, 수정사항이 있습니다.


4.2 데이터 입출력

CSV 파일 입력

import pandas as pd
%%writefile sample1.csv
c1, c2, c3
1, 1.11, one
2, 2.22, two
3, 3.33, three
Overwriting sample1.csv
  • %%writefile는 셀에 기입한 내용대로 텍스트 파일을 만드는 명령이다.

  • 여기선 샘플 데이터로 사용할 콤마로 구분된 파일 즉, CSV(Comma Seperated Values) 파일을 생성하였다.

# csv 파일 불러오기 
pd.read_csv('sample1.csv')
c1 c2 c3
0 1 1.11 one
1 2 2.22 two
2 3 3.33 three
  • pd.read_csv()를 사용하여 행 인덱스는 정수, 열 인덱스는 c1 ~ c3으로 데이터를 잘 불러왔다.
%%writefile sample2.csv
1, 1.11, one
2, 2.22, two
3, 3.33, three
Writing sample2.csv
  • 이번엔 열 이름이 없는 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
  • pd.read_csv() 사용시 names 옵션을 이용해서 열 인덱스를 직접 지정 가능하다.
# 특정 열을 행 인덱스로 사용하기
pd.read_csv('sample1.csv', index_col = "c1")
c2 c3
c1
1 1.11 one
2 2.22 two
3 3.33 three
  • pd.read_csv()의 index_col 옵션을 이용해서 특정 열 인덱스를 행 인덱스로 사용이 가능하다.
%%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
Overwriting 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
  • pd.read_table()로 txt파일을 잘 불러왔다.

  • 불러올 파일의 각 데이터가 공백을 구분자로 사용하는 경우 sep 옵션을 \s+를 지정한다.

%%writefile sample4.txt
파일 제목: sample4.txt
데이터 포맷의 설명:
c1, c2, c3
1, 1.11, one
2, 2.22, two
3, 3.33, three
Overwriting sample4.txt
  • 이번엔 파일 제목, 설명 등 필요 없는 내용을 포함해서 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
  • skiporws 옵션을 사용하면 원하지 않는 행을 건너뛰고 파일을 불러올 수 있다.
%%writefile sample5.csv
c1, c2, c3
1, 1.11, one
2, , two
누락, 3.33, three
Overwriting sample5.csv
  • 이번엔 “누락”이라는 데이터를 포함해서 파일을 생성하였다.
# 특정 값을 NaN 취급하고 싶은 경우
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
  • na_values 옵션을 사용하면 특정 값을 NaN으로 불러온다.

CSV 파일 출력

# csv파일 저장하기
df.to_csv('sample6.csv')
  • to_csv()를 이용하면 파이썬 내에 데이터 프레임을 CSV 파일로 내보낼 수 있다.
# csv파일 내용 확인하기
!type sample6.csv
,c1, c2, c3
0,1.0, 1.11, one
1,2.0, , two
2,, 3.33, three
  • !type sample6.csv는 나의 폴더에 sample6.csv 파일 내용을 미리 확인 할 수 있다.

  • 나는 윈도우를 사용하는데 리눅스, 맥은 !cat sample6.csv과 같이 입력하여야 한다고 한다.

# 구분자를 바꿔 저장하기
df.to_csv('sample7.txt', sep='|')
!type sample7.txt
|c1| c2| c3
0|1.0| 1.11| one
1|2.0| | two
2|| 3.33| three
  • 데이터를 불러올 때 sep로 구분자를 지정하면 해당 구분자로 구분해서 데이터를 불러온다.

  • 마찬가지로 데이터를 내보낼 때 sep를 구분자를 지정하면 해당 구분자로 구분된 형태로 파일을 저장한다.

# NaN 값을 바꿔 저장하기
df.to_csv('sample8.csv', na_rep='누락')
!type sample8.csv
,c1, c2, c3
0,1.0, 1.11, one
1,2.0, , two
2,누락, 3.33, three
  • 앞서 na_values 옵션을 사용하여 특정 값을 NaN으로 불러왔다.

  • 데이터를 내보낼 때 na_rep 옵션을 사용하면 NaN값을 특정 값으로 바꿔 저장한다.

# 행 인덱스, 열 인덱스 없이 저장하기
df.to_csv('sample9.csv', index=False, header=False)
!type sample9.csv
1.0, 1.11, one
2.0, , two
, 3.33, three
  • index, header 옵션을 False로 설정하면 행 인덱스, 열 인덱스 없이 저장한다.

인터넷 상의 CSV 파일 입력

# url을 이용하여 csv 파일을 다운하여 입력
df = pd.read_csv("https://raw.githubusercontent.com/datascienceschool/docker_rpython/master/data/titanic.csv")
df.head()
# df.tail()
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
  • 데이터를 불러올 때 나의 파일 경로가 아닌 url을 지정하면 판다스가 직접 다운하여 불러온다.

  • 직접 다운한다는 것이 나의 폴더에 파일을 다운 받는 것은 아니다.

  • head(), tail()을 사용하면 데이터의 앞, 뒤 일부분을 원하는 만큼 볼 수 있다.

df
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
... ... ... ... ... ... ... ... ... ... ... ... ...
886 887 0 2 Montvila, Rev. Juozas male 27.0 0 0 211536 13.0000 NaN S
887 888 1 1 Graham, Miss. Margaret Edith female 19.0 0 0 112053 30.0000 B42 S
888 889 0 3 Johnston, Miss. Catherine Helen "Carrie" female NaN 1 2 W./C. 6607 23.4500 NaN S
889 890 1 1 Behr, Mr. Karl Howell male 26.0 0 0 111369 30.0000 C148 C
890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.7500 NaN Q

891 rows × 12 columns

  • 데이터 전체를 보려하면 데이터 크기가 커서 일부만 잘려 보여진다.

  • pd.set_option("display.max_rows", n)을 사용하면 앞뒤로 모두 n행만큼 보여준다.

  • 여기선 사용하지 않았다.

인터넷 상의 데이터 베이스 자료 입력

import pandas_datareader as pdr
  • pandas_datareader는 일부 인터넷 사이트의 자료를 바로 pandas로 읽어들일 수 있다.
import datetime
dt_start = datetime.datetime(2015, 1, 1)
dt_end = "2016, 6, 30"
# 미국 GDP(국가총생산)
gdp = pdr.get_data_fred('GDP', dt_start, dt_end)
gdp
GDP
DATE
2015-01-01 18003.399
2015-04-01 18223.577
2015-07-01 18347.425
2015-10-01 18378.803
2016-01-01 18470.156
2016-04-01 18656.207
  • 위 예시는 pdr.get_data_fred()를 이용해서 FRED GDP 홈페이지에서 미국 GDP 자료를 불러왔다.

  • 사이트에 들어가보면 GDP자료가 분기별로 표시되어 있다.

  • 이를 원하는 날짜만 설정해서 가져온 것이다.

# CPIAUCSL: 모든 항목을 포함한 소비자 가격 지수
# CPILFESL: 식료품 및 연로를 제외한 소비자 가격 지수
inflation = pdr.get_data_fred(["CPIAUCSL", "CPILFESL"], dt_start, dt_end)
inflation
CPIAUCSL CPILFESL
DATE
2015-01-01 234.747 239.811
2015-02-01 235.342 240.172
2015-03-01 235.976 240.755
2015-04-01 236.222 241.346
2015-05-01 237.001 241.688
2015-06-01 237.657 242.064
2015-07-01 238.034 242.565
2015-08-01 238.033 242.817
2015-09-01 237.498 243.316
2015-10-01 237.733 243.768
2015-11-01 238.017 244.241
2015-12-01 237.761 244.547
2016-01-01 237.652 244.955
2016-02-01 237.336 245.510
2016-03-01 238.080 245.913
2016-04-01 238.992 246.551
2016-05-01 239.557 247.137
2016-06-01 240.222 247.540
  • 같은 방법으로 FRED CPIAUCSL 홈페이지, FRED CPILFESL 홈페이지 두 사이트에서 정보를 불러왔다.

  • 위 두 사이트는 월별로 자료가 표시되어 있다.

  • 직접 들어가서 사이트와 불러온 데이터를 비교하면 좋을 것이다.

Leave a comment