본문 바로가기

05. 빅분기 ADP/04. ADP

01. 파일 입출력

파일입출력

Pandas 노트 01장에서는 Pandas의 파일 입출력에 대하여 알아봅니다. 데이터 분석에서 일반적으로 사용되는 파일 형식인 엑셀(Excel)과 CSV (Comma Separated Value)을 로드하고 데이터프레임(DataFrame)을 엑셀(Excel)이나 CSV형식으로 저장하는 방법에 대해 학습해 봅니다.

모듈 import

from IPython.display import Image
import numpy as np
import pandas as pd

데이터 다운로드

# 데이터셋 다운로드를 위한 패키지 설치
!pip install opendata-kr -q

[출력]

WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv


from opendata import dataset
# 데이터셋 다운로드
dataset.download('서울시대중교통')
dataset.download('서울시주민등록인구')

[출력]

======= 다운로드 시작 =======

data/seoul_transportation.xlsx
0%|          | 0.00/26.2k [00:00
======= 다운로드 완료 =======
======= 다운로드 시작 =======

data/seoul_population.csv

[출력]

 

1) Excel

엑셀 파일의 입출력에 대해 알아보도록 합니다.

Excel 도큐먼트


Excel - 불러오기

Excel 데이터를 바로 읽어들일 수 있으며, sheet_name을 지정하면 해당 sheet를 가져옵니다.

[참고] pd.read_excel()로 엑셀 데이터 로드시 에러 발생한다면 engine='openpyxl'을 추가

excel = pd.read_excel('data/seoul_transportation.xlsx', sheet_name='철도', engine='openpyxl')
excel.head()

[출력]

대중교통구분노선명년월승차총승객수01234
지하철 1호선 201711 8633618
지하철 1호선 201712 8737235
지하철 1호선 201801 8145989
지하철 1호선 201802 7273309
지하철 1호선 201803 8692551

excel = pd.read_excel('data/seoul_transportation.xlsx', sheet_name='버스', engine='openpyxl')
excel.head()

[출력]

대중교통구분년월승차총승객수01234
버스 201711 163443126
버스 201712 162521011
버스 201801 153335185
버스 201802 134768582
버스 201803 166177855

sheet_name을 None으로 지정하면, 모든 sheet를 가지고 옵니다.

 

가지고 올 때는 OrderedDict로 가져오며, keys()로 시트명을 조회할 수 있습니다.

excel = pd.read_excel('data/seoul_transportation.xlsx', sheet_name=None, engine='openpyxl')
excel

[출력]

{'철도':     대중교통구분    노선명      년월   승차총승객수
 0      지하철    1호선  201711  8633618
 1      지하철    1호선  201712  8737235
 2      지하철    1호선  201801  8145989
 3      지하철    1호선  201802  7273309
 4      지하철    1호선  201803  8692551
 ..     ...    ...     ...      ...
 596    지하철  우이신설선  201901  1263643
 597    지하철  우이신설선  201902  1102109
 598    지하철  우이신설선  201903  1402393
 599    지하철  우이신설선  201904  1403115
 600    지하철  우이신설선  201905  1469681

 [601 rows x 4 columns],
 '버스':    대중교통구분      년월     승차총승객수
 0      버스  201711  163443126
 1      버스  201712  162521011
 2      버스  201801  153335185
 3      버스  201802  134768582
 4      버스  201803  166177855
 5      버스  201804  160452595
 6      버스  201805  164390595
 7      버스  201806  156999747
 8      버스  201807  163736112
 9      버스  201808  160240197
 10     버스  201809  151311657
 11     버스  201810  165820934
 12     버스  201811  163017758
 13     버스  201812  158049446
 14     버스  201901  153037549
 15     버스  201902  131621925
 16     버스  201903  161694445
 17     버스  201904  161900273
 18     버스  201905  166587933}

keys()로 포함하고 있는 시트를 조회합니다.

# 시트 조회
excel.keys()

[출력]

 
dict_keys(['철도', '버스'])

excel['철도'].head()

[출력]

대중교통구분노선명년월승차총승객수01234
지하철 1호선 201711 8633618
지하철 1호선 201712 8737235
지하철 1호선 201801 8145989
지하철 1호선 201802 7273309
지하철 1호선 201803 8692551

excel['버스'].head()

[출력]

대중교통구분년월승차총승객수01234
버스 201711 163443126
버스 201712 162521011
버스 201801 153335185
버스 201802 134768582
버스 201803 166177855

Excel - 저장하기

DataFrame을 Excel로 저장할 수 있으며, Excel로 저장시 파일명을 지정합니다.

  • index=False 옵션은 가급적 꼭 지정하는 옵션입니다. 지정을 안하면 index가 별도의 컬럼으로 저장되게 됩니다.
  • sheet_name을 지정하여, 저장할 시트의 이름을 변경할 수 있습니다.
excel = pd.read_excel('data/seoul_transportation.xlsx', sheet_name='철도', engine='openpyxl')
excel.head()

[출력]

 
대중교통구분노선명년월승차총승객수01234
지하철 1호선 201711 8633618
지하철 1호선 201712 8737235
지하철 1호선 201801 8145989
지하철 1호선 201802 7273309
지하철 1호선 201803 8692551

별도의 시트명 지정 없이 저장

excel.to_excel('sample.xlsx', index=True)

시트명을 샘플로 지정하여 저장

excel.to_excel('sample1.xlsx', index=False, sheet_name='샘플')

 

2) CSV (Comma Separated Values)

- - 한 줄이 한 개의 행에 해당하며, 열 사이에는 쉼표(,)를 넣어 구분합니다. - Excel보다는 훨씬 가볍고 차지하는 용량이 적기 때문에 대부분의 파일데이터는 csv 형태로 제공됩니다.


CSV - 불러오기

df = pd.read_csv('data/seoul_population.csv')
df

[출력]

연도자치구세대수인구 합계남자 인구 합계여자 인구 합계한국인 인구 합계한국인 남자 인구수한국인 여자 인구수등록 외국인 인구 합계등록 외국인 인구 남자수등록 외국인 인구 여자수세대당 인구65세 이상 고령자 수012345678910111213141516171819202122232425
2020 합계 4,417,954 9,911,088 4,816,522 5,094,566 9,668,465 4,701,723 4,966,742 242,623 114,799 127,824 2.19 1,568,331
2020 종로구 75,003 158,996 76,876 82,120 149,384 72,635 76,749 9,612 4,241 5,371 1.99 28,507
2020 중구 63,686 134,635 65,776 68,859 125,240 61,222 64,018 9,395 4,554 4,841 1.97 24,495
2020 용산구 113,093 244,645 118,835 125,810 230,040 110,722 119,318 14,605 8,113 6,492 2.03 40,247
2020 성동구 135,870 300,505 146,424 154,081 293,556 143,387 150,169 6,949 3,037 3,912 2.16 45,603
2020 광진구 167,427 360,109 173,000 187,109 346,682 167,310 179,372 13,427 5,690 7,737 2.07 50,560
2020 동대문구 167,598 357,014 175,322 181,692 342,837 169,769 173,068 14,177 5,553 8,624 2.05 61,796
2020 중랑구 185,920 399,562 197,118 202,444 394,702 195,165 199,537 4,860 1,953 2,907 2.12 69,447
2020 성북구 195,396 447,056 214,658 232,398 437,153 210,810 226,343 9,903 3,848 6,055 2.24 73,770
2020 강북구 145,896 311,569 151,466 160,103 308,055 150,143 157,912 3,514 1,323 2,191 2.11 63,422
2020 도봉구 139,114 327,361 159,420 167,941 325,257 158,620 166,637 2,104 800 1,304 2.34 62,059
2020 노원구 218,270 527,032 254,188 272,844 523,037 252,383 270,654 3,995 1,805 2,190 2.40 85,489
2020 은평구 213,914 484,043 231,998 252,045 479,835 230,279 249,556 4,208 1,719 2,489 2.24 85,187
2020 서대문구 144,838 322,952 153,152 169,800 312,173 149,360 162,813 10,779 3,792 6,987 2.16 54,204
2020 마포구 178,482 381,858 178,977 202,881 371,890 175,150 196,740 9,968 3,827 6,141 2.08 54,331
2020 양천구 180,633 457,781 224,379 233,402 454,251 222,824 231,427 3,530 1,555 1,975 2.51 65,670
2020 강서구 266,982 585,901 282,686 303,215 580,185 280,034 300,151 5,716 2,652 3,064 2.17 88,984
2020 구로구 180,531 432,488 215,424 217,064 404,408 199,673 204,735 28,080 15,751 12,329 2.24 70,198
2020 금천구 114,715 247,835 126,141 121,694 231,733 117,226 114,507 16,102 8,915 7,187 2.02 39,842
2020 영등포구 184,714 407,367 202,969 204,398 379,480 187,647 191,833 27,887 15,322 12,565 2.05 61,688
2020 동작구 184,229 401,572 193,718 207,854 391,220 189,152 202,068 10,352 4,566 5,786 2.12 65,190
2020 관악구 274,811 509,803 255,211 254,592 495,060 248,339 246,721 14,743 6,872 7,871 1.80 78,875
2020 서초구 173,502 429,025 205,282 223,743 425,126 203,359 221,767 3,899 1,923 1,976 2.45 60,169
2020 강남구 234,872 544,055 260,378 283,677 539,231 257,999 281,232 4,824 2,379 2,445 2.30 75,096
2020 송파구 281,959 673,926 325,080 348,846 667,960 322,299 345,661 5,966 2,781 3,185 2.37 93,483
2020 강동구 196,499 463,998 228,044 235,954 459,970 226,216 233,754 4,028 1,828 2,200 2.34 70,019

CSV - 저장하기

저장하는 방법은 excel과 유사합니다. 다만, csv파일 형식에는 sheet_name 옵션은 없습니다.

df = pd.read_csv('data/seoul_population.csv')

to_csv()으로 csv 파일형식으로 저장할 수 있습니다.

df.to_csv('sample.csv', index=False)

읽어들인 Excel 파일도 Csv로 저장할 수 있습니다.

 
excel = pd.read_excel('data/seoul_transportation.xlsx', sheet_name='버스', engine='openpyxl')
excel.head()

[출력]

대중교통구분년월승차총승객수01234
버스 201711 163443126
버스 201712 162521011
버스 201801 153335185
버스 201802 134768582
버스 201803 166177855
Copyexcel.to_csv('sample1.csv', index=False)