[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