2023년 6월 업데이트

 

안녕하세요. SQLER의 코난 김대우입니다. 

이번 강좌에서는, Python 머신러닝 강좌 - 7. Pandas DataFrame으로 CSV 파일 읽고 쓰기를 진행토록 하겠습니다.

예제 노트북 파일 : 7. Pandas DataFrame으로 CSV 파일 읽고 쓰기 예제 노트북 

 

SQLER에서 진행되는 전체 Python / 머신러닝 강좌 목록

 

코드를 실행하기 위해서는, vscode에서 새로운 파일을 만들고 강좌 내용을 단계별로 copy&paste 해서 실행하시면 됩니다. 또는, Jupyter notebook을 실행하고 단계별로 실행하셔도 됩니다.

예를 들어, 7_pandas_csv.ipynb를 생성하고 vscode에서 실행하면, Jupyter notebook이 실행됩니다.(vscode에서 실행도 가능하며, 웹브라우저에서도 실행 가능합니다.)

또는, github 리포지토리를 clone 하신 후, vscode나 Jupyter notebook에서, 위의 노트북 파일을 열면 됩니다. 
 

상세한 환경 구성이 필요하시다면, 개발자 커뮤니티 SQLER.com - Python 초급 강좌 목차 - 1. Python 개발 환경 구성 문서를 참조해 WSL, vscode, conda, jupyter notebook 설정을 모두 먼저 완료하시길 권장해 드립니다.

 

 

 

TL;DR

CSV 파일을 DataFrame으로 로드하기 위해 read_csv 함수를 사용하고, 반대로 저장하기 위해 to_csv 함수를 사용합니다. 이 챕터에서는 CSV에서 로드한 오류가 있는 데이터, 헤더 없는 데이터, 누락된 값 처리 등을 코드로 해결하는 방안에 대해 진행합니다.
 

 

Python 머신러닝 강좌 - 7. Pandas DataFrame으로 CSV 파일 읽고 쓰기

이전 강좌에서 소개해 드린 것처럼, CSV 파일 포맷은 가장 많이 사용되는 머신러닝을 위한 데이터 포맷입니다.

이번 시간에는 지난 강좌에서 업로드한 CSV 파일의 데이터를 DataFrame으로 로드합니다.

 

일반적인 기능 및 속성

  • read_csv는 쉼표로 구분된(comma-separated) 값 파일을 DataFrame으로 로드합니다.
  • to_csv는 DataFrame의 데이터를 쉼표로 구분해 파일로 저장합니다.
  • NaN은 누락된 값(missing value)을 표현합니다.

 

CSV 파일을 Pandas DataFrame으로 로드

read_csv를 사용하면, CSV 파일의 내용을 DataFrame으로 로드할 수 있습니다.

airports.csv에 포함된 데이터는 아래와 같습니다. 또는 clone 한 리포지토리를 보셔도 csv 파일을 찾을 수 있습니다.

Name,City,Country
Seattle-Tacoma,Seattle,USA
Dulles,Washington,USA
Heathrow,London,United Kingdom
Schiphol,Amsterdam,Netherlands
Changi,Singapore,Singapore
Pearson,Toronto,Canada
Narita,Tokyo,Japan

 

pandas를 이용해 csv를 dataframe으로 로드합니다.

import pandas as pd

airports_df = pd.read_csv('airports.csv')
airports_df
 

=== 결과 ===

  Name City Country
0 Seattle-Tacoma Seattle USA
1 Dulles Washington USA
2 Heathrow London United Kingdom
3 Schiphol Amsterdam Netherlands
4 Changi Singapore Singapore
5 Pearson Toronto Canada
6 Narita Tokyo Japan

 

 

오류가 있는 row 처리

기본적으로 콤마(,)가 더 많거나 기타 문제가 있는 row로 인해 오류가 발생합니다. airportsInvalidRows.csv의 Heathrow London row에서 잘못 입력된 콤마를 확인할 수 있습니다.

Name,City,Country
Seattle-Tacoma,Seattle,USA
Dulles,Washington,USA
Heathrow,London,,United Kingdom
Schiphol,Amsterdam,Netherlands
Changi,Singapore,Singapore
Pearson,Toronto,Canada
Narita,Tokyo,Japan

 

이렇게 잘못된 csv 데이터에서 로드를 시도하면, 오류가 발생합니다.

airports_df = pd.read_csv('airportsInvalidRows.csv')
airports_df

=== 결과 ===
---------------------------------------------------------------------------
ParserError                               Traceback (most recent call last)
<ipython-input-7-909c407d14bb> in <module>
----> 1 airports_df = pd.read_csv('airportsInvalidRows.csv')
      2 airports_df

~/anaconda3/lib/python3.7/site-packages/pandas/io/parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)
    674         )
    675 
--> 676         return _read(filepath_or_buffer, kwds)
    677 
    678     parser_f.__name__ = name

~/anaconda3/lib/python3.7/site-packages/pandas/io/parsers.py in _read(filepath_or_buffer, kwds)
    452 
    453     try:
--> 454         data = parser.read(nrows)
    455     finally:
    456         parser.close()

~/anaconda3/lib/python3.7/site-packages/pandas/io/parsers.py in read(self, nrows)
   1131     def read(self, nrows=None):
   1132         nrows = _validate_integer("nrows", nrows)
-> 1133         ret = self._engine.read(nrows)
   1134 
   1135         # May alter columns / col_dict

~/anaconda3/lib/python3.7/site-packages/pandas/io/parsers.py in read(self, nrows)
   2035     def read(self, nrows=None):
   2036         try:
-> 2037             data = self._reader.read(nrows)
   2038         except StopIteration:
   2039             if self._first_chunk:

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader.read()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._read_low_memory()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._read_rows()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._tokenize_rows()

pandas/_libs/parsers.pyx in pandas._libs.parsers.raise_parser_error()

ParserError: Error tokenizing data. C error: Expected 3 fields in line 4, saw 4

 

이럴 경우, error_bad_lines=False를 지정해 오류를 발생하는 row를 skip 할 수 있습니다.

 

airports_df = pd.read_csv(
                          'airportsInvalidRows.csv', 
                           on_bad_lines='skip'  #pandas 1.4 미만 error_bad_lines=False
                           )
airports_df

=== 결과 ===

b'Skipping line 4: expected 3 fields, saw 4\n'

  Name City Country
0 Seattle-Tacoma Seattle USA
1 Dulles Washington USA
2 Schiphol Amsterdam Netherlands
3 Changi Singapore Singapore
4 Pearson Toronto Canada
5 Narita Tokyo Japan

 

 

column header를 포함하고 있지 않은 파일 처리

파일의 첫 번째 row에 column header가 없는 경우, 데이터의 첫 번째 row가 header로 처리됩니다. airportsNoHeaderRows.csv에는 공항 데이터가 포함되어 있지만 column header를 지정하는 row가 없습니다.

Seattle-Tacoma,Seattle,USA
Dulles,Washington,USA
Heathrow,London,United Kingdom
Schiphol,Amsterdam,Netherlands
Changi,Singapore,Singapore
Pearson,Toronto,Canada
Narita,Tokyo,Japan

 

csv 파일을 dataframe으로 로드합니다.

airports_df = pd.read_csv('airportsNoHeaderRows.csv')
airports_df

=== 결과 ===

  Seattle-Tacoma Seattle USA
0 Dulles Washington USA
1 Heathrow London United Kingdom
2 Schiphol Amsterdam Netherlands
3 Changi Singapore Singapore
4 Pearson Toronto Canada
5 Narita Tokyo Japan

 

이렇게 기본적으로 첫 row를 header row로 처리합니다. header row가 없는 경우 header=None을 지정하여, 데이터의 첫 번째 row가 header row로 처리되지 않도록 합니다.

airports_df = pd.read_csv(
                          'airportsNoHeaderRows.csv', 
                           header=None
                           )
airports_df

=== 결과 ===

  0 1 2
0 Seattle-Tacoma Seattle USA
1 Dulles Washington USA
2 Heathrow London United Kingdom
3 Schiphol Amsterdam Netherlands
4 Changi Singapore Singapore
5 Pearson Toronto Canada
6 Narita Tokyo Japan

 

또한, header row가 없는 경우에는 names 파라미터를 사용하여, 데이터가 로드될 때 column 이름을 지정할 수 있습니다.

airports_df = pd.read_csv(
                          'airportsNoHeaderRows.csv', 
                          header=None, 
                          names=['Name', 'City', 'Country']
                          )
airports_df

=== 결과 ===

  Name City Country
0 Seattle-Tacoma Seattle USA
1 Dulles Washington USA
2 Heathrow London United Kingdom
3 Schiphol Amsterdam Netherlands
4 Changi Singapore Singapore
5 Pearson Toronto Canada
6 Narita Tokyo Japan

 

데이터 파일의 누락된 값(missing value)

누락된 값은 DataFrame에 NaN으로 표시됩니다. SQL의 NULL과 유사합니다.

airportsBlankValues.csv에 Schiphol 공항으로 표시된 도시가 누락되어 있습니다.

Name,City,Country
Seattle-Tacoma,Seattle,USA
Dulles,Washington,USA
Heathrow,London,United Kingdom
Schiphol,,Netherlands
Changi,Singapore,Singapore
Pearson,Toronto,Canada
Narita,Tokyo,Japan

 

NaN 데이터가 포함된 csv를 로드합니다.

airports_df = pd.read_csv('airportsBlankValues.csv')
airports_df

=== 결과 ===

  Name City Country
0 Seattle-Tacoma Seattle USA
1 Dulles Washington USA
2 Heathrow London United Kingdom
3 Schiphol NaN Netherlands
4 Changi Singapore Singapore
5 Pearson Toronto Canada
6 Narita Tokyo Japan

 

☑️ 챗GPT 활용: python NaN에 대해서 알려줘

 

CSV 파일에 DataFrame을 쓰기

to_csv는 pandas DataFrame의 내용을 CSV 파일에 씁니다.

airports_df

=== 결과 ===

  Name City Country
0 Seattle-Tacoma Seattle USA
1 Dulles Washington USA
2 Heathrow London United Kingdom
3 Schiphol NaN Netherlands
4 Changi Singapore Singapore
5 Pearson Toronto Canada
6 Narita Tokyo Japan

 

airports_df.to_csv('MyNewCSVFile.csv')

index column(색인 컬럼)이 csv 파일에 기록됩니다.

 

index=False을 지정하면, CSV 파일에 index column을 추가하지 않습니다.

airports_df.to_csv(
                   'MyNewCSVFileNoIndex.csv', 
                    index=False
                    )

 

☑️ 챗GPT 활용: python에서 to_csv()에 대해서 상세히 알려줘

 

수고하셨습니다.

 

 

파이썬 강좌 책 구매

강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다. 

 

책구매 링크: 챗GPT와 함께하는 파이썬 & 머신러닝 코딩 마스터 

파이썬-책구매링크.png

 

참고자료

개발자 커뮤니티 SQLER.com - Python 무료 강좌 - 기초, 중급, 머신러닝

c9-python-getting-started/even-more-python-for-beginners-data-tools/07 - Read and write CSV files from pandas DataFrames at master · CloudBreadPaPa/c9-python-getting-started (github.com)

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 22183
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 12260
34 Azure Databricks - MLflow를 이용한 머신러닝(5) - Model 배포 file 코난(김대우) 2021.10.14 497
33 Azure Databricks - MLflow를 이용한 머신러닝(4) - Model Registry file 코난(김대우) 2021.10.12 332
32 Azure Databricks - MLflow를 이용한 머신러닝(3) - Project file 코난(김대우) 2021.10.08 315
31 Azure Databricks - MLflow를 이용한 머신러닝(2) - Tracking file 코난(김대우) 2021.10.08 301
30 Azure Databricks - MLflow를 이용한 머신러닝(1) file 코난(김대우) 2021.10.08 415
29 Azure Databricks - Spark에서 머신러닝 분산 처리 file 코난(김대우) 2021.10.07 152
28 PySpark cheat sheet 자료 - RDD, 데이터 처리 file 코난(김대우) 2021.10.01 120
27 PySpark을 이용한 머신러닝 튜토리얼 예제 코난(김대우) 2021.10.01 907
26 Form Recognizer로 문서에서 표 데이터 추출 file 코난(김대우) 2021.01.21 337
25 MLaaS - 12가지의 머신러닝을 먼저 도입한 기업들의 고민 file 코난(김대우) 2021.01.15 730
24 Python 머신러닝 강좌 - 15. Matplotlib으로 데이터 시각화(visualization) file 코난(김대우) 2021.01.09 705
23 Python 머신러닝 강좌 - 14. NumPy와 Pandas 코난(김대우) 2021.01.09 686
22 Python 머신러닝 강좌 - 13. 모델의 정확도 평가(accuracy evaluating) 코난(김대우) 2021.01.09 1681
21 Python 머신러닝 강좌 - 12. 머신러닝 모델 테스트 코난(김대우) 2021.01.09 983
20 Python 머신러닝 강좌 - 11. scikit-learn으로 선형회귀(linear regression) 모델 머신러닝 트레이닝 수행 코난(김대우) 2021.01.08 349
19 Python 머신러닝 강좌 - 10. 머신러닝을 위해 scikit-learn으로 트레이닝 데이터와 테스트 데이터 분할 코난(김대우) 2021.01.08 535
18 Python 머신러닝 강좌 - 9. 중복데이터와 결측값(missing value) 처리 코난(김대우) 2021.01.08 254
17 Python 머신러닝 강좌 - 8. Pandas DataFrame 컬럼(column) 분할(split)과 삭제(remove) 코난(김대우) 2021.01.08 382
» Python 머신러닝 강좌 - 7. Pandas DataFrame으로 CSV 파일 읽고 쓰기 코난(김대우) 2021.01.08 511
15 Python 머신러닝 강좌 - 6. CSV 파일과 주피터 노트북 file 코난(김대우) 2021.01.08 439





XE Login