🔥알림🔥
① 테디노트 유튜브 - 구경하러 가기!
② LangChain 한국어 튜토리얼 바로가기 👀
③ 랭체인 노트 무료 전자책(wikidocs) 바로가기 🙌

5 분 소요

이번 에피소드에서는 Pandas의 파일 입출력에 대하여 알아보겠습니다. 그리고, 데이터 분석에서 DB를 제외한 가장 많이 사용되는 파일 형식인 엑셀(Excel)과 CSV (Comma Separated Value)을 로드하고 데이터프레임(DataFrame)을 엑셀(Excel)이나 CSV형식으로 저장하는 방법에 대하여 공유하고자 합니다.

모듈 import

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

Excel

Excel - 불러오기

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

excel = pd.read_excel('seoul_transportation.xlsx', sheet_name='철도')
excel.head()
대중교통구분 노선명 년월 승차총승객수
0 지하철 1호선 201711 8633618
1 지하철 1호선 201712 8737235
2 지하철 1호선 201801 8145989
3 지하철 1호선 201802 7273309
4 지하철 1호선 201803 8692551
excel = pd.read_excel('seoul_transportation.xlsx', sheet_name='버스')
excel.head()
대중교통구분 년월 승차총승객수
0 버스 201711 163443126
1 버스 201712 162521011
2 버스 201801 153335185
3 버스 201802 134768582
4 버스 201803 166177855

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

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

excel = pd.read_excel('seoul_transportation.xlsx', sheet_name=None)
excel
OrderedDict([('철도',     대중교통구분    노선명      년월   승차총승객수
              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)])
# 시트 조회
excel.keys()
odict_keys(['철도', '버스'])
excel['철도'].head()
대중교통구분 노선명 년월 승차총승객수
0 지하철 1호선 201711 8633618
1 지하철 1호선 201712 8737235
2 지하철 1호선 201801 8145989
3 지하철 1호선 201802 7273309
4 지하철 1호선 201803 8692551
excel['버스'].head()
대중교통구분 년월 승차총승객수
0 버스 201711 163443126
1 버스 201712 162521011
2 버스 201801 153335185
3 버스 201802 134768582
4 버스 201803 166177855

Excel - 저장하기

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

  • index=False 옵션은 가급적 꼭 지정하는 옵션입니다. 지정을 안하면 index가 별도의 컬럼으로 저장되게 됩니다.
  • sheet_name을 지정하여, 저장할 시트의 이름을 변경할 수 있습니다.
excel.to_excel('sample.xlsx', index=True)
excel.to_excel('sample1.xlsx', index=False, sheet_name='샘플')

Excel - 여러개의 시트에 저장

여래 개의 시트에 저장하기 위해서는 ExcelWriter를 사용해야 합니다.

writer = pd.ExcelWriter('sample2.xlsx')
excel.to_excel(writer, index=False, sheet_name='샘플1')
excel.to_excel(writer, index=False, sheet_name='샘플2')
excel.to_excel(writer, index=False, sheet_name='샘플3')
writer.close()

CSV (Comma Separated Values)

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

(참고) 쉼표를 찍어 놓은 금액 데이터(100,000)를 CSV에 직접 집어넣으면 나중에 해석할 때 서로 다른 열로 취급되므로 문제가 될 수 있습니다. 해결책으로 쉼표 대신 탭 문자(\t)를 구분자로 사용하는 것이다. 이러한 경우 Tab Separated Values(TSV)라고 부른다.

CSV - 불러오기

df = pd.read_csv('seoul_population.csv')
df.head()
자치구 세대 남자 여자 계.1 남자.1 여자.1 계.2 남자.2 여자.2 세대당인구 65세이상고령자
0 합계 4,202,888 10,197,604 5,000,005 5,197,599 9,926,968 4,871,560 5,055,408 270,636 128,445 142,191 2.36 1,321,458
1 종로구 72,654 162,820 79,675 83,145 153,589 75,611 77,978 9,231 4,064 5,167 2.11 25,425
2 중구 59,481 133,240 65,790 67,450 124,312 61,656 62,656 8,928 4,134 4,794 2.09 20,764
3 용산구 106,544 244,203 119,132 125,071 229,456 111,167 118,289 14,747 7,965 6,782 2.15 36,231
4 성동구 130,868 311,244 153,768 157,476 303,380 150,076 153,304 7,864 3,692 4,172 2.32 39,997

때때로 한글데이터를 불러올 때 다른 인코딩을 사용해야하는 경우도 있습니다.그럴 땐 encoding 옵션을 지정해주면 됩니다.

df = pd.read_csv('seoul_population.csv', encoding='utf8')
df.head()
자치구 세대 남자 여자 계.1 남자.1 여자.1 계.2 남자.2 여자.2 세대당인구 65세이상고령자
0 합계 4,202,888 10,197,604 5,000,005 5,197,599 9,926,968 4,871,560 5,055,408 270,636 128,445 142,191 2.36 1,321,458
1 종로구 72,654 162,820 79,675 83,145 153,589 75,611 77,978 9,231 4,064 5,167 2.11 25,425
2 중구 59,481 133,240 65,790 67,450 124,312 61,656 62,656 8,928 4,134 4,794 2.09 20,764
3 용산구 106,544 244,203 119,132 125,071 229,456 111,167 118,289 14,747 7,965 6,782 2.15 36,231
4 성동구 130,868 311,244 153,768 157,476 303,380 150,076 153,304 7,864 3,692 4,172 2.32 39,997

CSV - 큰 파일 데이터 끊어서 불러오기

데이터의 크기가 매우 큰 경우 memory에 한 번에 로드할 수 없습니다.

chunksize를 지정하고 chunksize만큼 끊어서 불어와서 처리하게 되면 용량이 매우 큰 데이터도 처리할 수 있습니다.

예시) chunksize=10: 10개의 데이터를 로드합니다.

df = pd.read_csv('seoul_population.csv', chunksize=10)
for d in df:
    display(d)
자치구 세대 남자 여자 계.1 남자.1 여자.1 계.2 남자.2 여자.2 세대당인구 65세이상고령자
0 합계 4,202,888 10,197,604 5,000,005 5,197,599 9,926,968 4,871,560 5,055,408 270,636 128,445 142,191 2.36 1,321,458
1 종로구 72,654 162,820 79,675 83,145 153,589 75,611 77,978 9,231 4,064 5,167 2.11 25,425
2 중구 59,481 133,240 65,790 67,450 124,312 61,656 62,656 8,928 4,134 4,794 2.09 20,764
3 용산구 106,544 244,203 119,132 125,071 229,456 111,167 118,289 14,747 7,965 6,782 2.15 36,231
4 성동구 130,868 311,244 153,768 157,476 303,380 150,076 153,304 7,864 3,692 4,172 2.32 39,997
5 광진구 158,960 372164 180992 191172 357211 174599 182612 14953 6393 8560 2.25 42214
6 동대문구 159839 369496 182932 186564 354079 177021 177058 15417 5911 9506 2.22 54173
7 중랑구 177548 414503 206102 208401 409882 204265 205617 4621 1837 2784 2.31 56774
8 성북구 188512 461260 224076 237184 449773 219545 230228 11487 4531 6956 2.39 64692
9 강북구 141554 330192 161686 168506 326686 160353 166333 3506 1333 2173 2.31 54813
자치구 세대 남자 여자 계.1 남자.1 여자.1 계.2 남자.2 여자.2 세대당인구 65세이상고령자
10 도봉구 136613 348646 171026 177620 346629 170289 176340 2017 737 1280 2.54 51312
11 노원구 219957 569384 276823 292561 565565 275211 290354 3819 1612 2207 2.57 71941
12 은평구 201869 494388 240220 254168 489943 238337 251606 4445 1883 2562 2.43 72334
13 서대문구 137207 327163 156765 170398 314982 152613 162369 12181 4152 8029 2.30 48161
14 마포구 169404 389649 185889 203760 378566 181346 197220 11083 4543 6540 2.23 48765
15 양천구 176921 479978 237117 242861 475949 235278 240671 4029 1839 2190 2.69 52975
16 강서구 247696 603772 294433 309339 597248 291249 305999 6524 3184 3340 2.41 72548
17 구로구 172272 447874 224436 223438 416487 207114 209373 31387 17322 14065 2.42 56833
18 금천구 105146 255082 130558 124524 236353 120334 116019 18729 10224 8505 2.25 32970
19 영등포구 165462 402985 202573 200412 368072 183705 184367 34913 18868 16045 2.22 52413
자치구 세대 남자 여자 계.1 남자.1 여자.1 계.2 남자.2 여자.2 세대당인구 65세이상고령자
20 동작구 173033 412520 201217 211303 400456 195775 204681 12064 5442 6622 2.31 56013
21 관악구 253826 525515 264763 260752 507203 256090 251113 18312 8673 9639 2.00 68082
22 서초구 173856 450310 216264 234046 445994 214036 231958 4316 2228 2088 2.57 51733
23 강남구 234107 570500 273301 297199 565550 270726 294824 4950 2575 2375 2.42 63167
24 송파구 259883 667483 325040 342443 660584 321676 338908 6899 3364 3535 2.54 72506
25 강동구 179676 453233 225427 227806 449019 223488 225531 4214 1939 2275 2.50 54622

CSV - 저장하기

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

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

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

excel = pd.read_excel('seoul_transportation.xlsx', sheet_name='버스')
excel.head()
대중교통구분 년월 승차총승객수
0 버스 201711 163443126
1 버스 201712 162521011
2 버스 201801 153335185
3 버스 201802 134768582
4 버스 201803 166177855
excel.to_csv('sample1.csv', index=False)

댓글남기기