본문 바로가기
두두 IT/머신런닝(ML)

Pandas DataFrame으로 CSV 파일 읽고 쓰기

by DoDo's 2026. 5. 17.
반응형

1. CSV 파일 읽어오기 (read_csv)

[이론] CSV(Comma-Separated Values)는 데이터를 쉼표(,)로 구분하여 저장한 파일 형식이에요. 머신러닝이나 데이터 분석에서 가장 많이 쓰이는 기본 포맷이죠. Pandas에서는 pd.read_csv() 함수를 사용해 이 파일을 '데이터프레임(DataFrame)' 형태로 아주 쉽게 불러올 수 있습니다 

[코드 & 실행 값]

Python
import pandas as pd

# 1. 정상적인 CSV 파일 읽어오기
airports_df = pd.read_csv('airports.csv')
print(airports_df)

실행 결과:

Plaintext
             Name          City         Country
0   Seattle-Tacoma       Seattle             USA
1           Dulles    Washington             USA
2  London Heathrow        London  United Kingdom
3         Schiphol     Amsterdam     Netherlands
4           Changi     Singapore       Singapore

2. 문제 있는 데이터(Bad Lines) 건너뛰기

[이론] 데이터를 다루다 보면 쉼표가 너무 많거나 형식이 꼬여있는 '불량 데이터(Bad line)'가 섞여 있을 때가 있어요. 이럴 때 무작정 파일을 읽으려고 하면 에러가 납니다

  • 꿀팁: Pandas 1.4 버전 이후부터는 on_bad_lines='skip' 옵션을 사용해서 에러가 나는 줄을 가볍게 무시하고 정상적인 데이터만 불러올 수 있어요! (과거 1.4 미만 버전에서는 error_bad_lines=False를 썼답니다)

CSV 파일을 확인하는데 Heathrow, London,,United Kingdom, 즉 콤마로 이루어져 있는데 갑자기 콤마 2개가 있는 줄이 4번째 줄에 있다.

이것을 불러오게 되면 ParserError이 발생해서 불러올 수 없다 그러나 문제가 있는 4번째 줄을 제외하고 불러올 수 있다.

[코드 & 실행 값]

Python
# 에러가 있는 줄은 건너뛰고 불러오기
df_invalid = pd.read_csv('invalid_rows.csv', on_bad_lines='skip')
print(df_invalid)

실행 결과:

Plaintext
# 에러가 발생한 라인은 스킵되고 나머지 데이터만 정상 출력됩니다.
		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

3. 컬럼명(Header)이 없는 데이터 처리하기

[이론] 어떤 CSV 파일은 친절하게 첫 줄에 'Name, City, Country' 같은 컬럼명(Header)이 없고, 바로 데이터가 시작되기도 해요

이때 그냥 불러오면 첫 번째 데이터가 엉뚱하게 컬럼명으로 인식되어 버립니다. 이럴 땐 header=None으로 설정하고, names 옵션을 통해 우리가 직접 리스트 형태로 컬럼명을 지어주면 됩니다.

[코드 & 실행 값]

Python
 
# 첫 줄이 컬럼으로 들어가지 않게 막고, 직접 컬럼명 지정하기
column_names = ['Name', 'City', 'Country']
df_no_header = pd.read_csv('no_header.csv', header=None, names=column_names)
print(df_no_header)

실행 결과:

Plaintext
 
             Name          City         Country
0   Seattle-Tacoma       Seattle             USA
1           Dulles    Washington             USA
2  London Heathrow        London  United Kingdom

4. 결측치(NaN) 이해하기 + (🔥보충 학습: 결측치 채우기)

[이론] 데이터 중간에 값이 비어있는 경우(누락된 값), Pandas는 이를 NaN (Not a Number) 으로 표시합니다. 일종의 '결측치'죠. 영상에서는 스키폴 공항의 City 값이 비어있어 NaN으로 표시되는 것을 확인했습니다.

하지만 실제 코딩에서는 이 빈칸을 그대로 두지 않고 채우거나 지우는 작업이 필수입니다! 제가 추가로 빈칸을 채우는 코드를 알려드릴게요.

[코드 & 실행 값]

Python
# 특정 값이 비어있는(NaN) 데이터프레임이 있다고 가정해볼게요.
print("--- 원본 데이터 ---")
print(df_missing)

# 빈칸(NaN)을 'Unknown'이라는 글자로 일괄 채워넣기 (보충 학습!)
df_filled = df_missing.fillna('Unknown')
print("\n--- 빈칸 채운 데이터 ---")
print(df_filled)

실행 결과:

Plaintext
--- 원본 데이터 ---
       Name     City      Country
0  Schiphol      NaN  Netherlands

--- 빈칸 채운 데이터 ---
       Name     City      Country
0  Schiphol  Unknown  Netherlands

5. 가공한 데이터를 다시 CSV로 저장하기 (to_csv)

[이론] 데이터를 예쁘게 다듬었다면 다시 파일로 저장해야겠죠? 이때는 to_csv() 메서드를 씁니다.

  • 핵심 포인트: 저장할 때 index=False 옵션을 꼭 넣어주세요! 이걸 넣지 않으면 0, 1, 2, 3 같은 맨 앞의 숫자 인덱스가 새로운 데이터 컬럼으로 같이 저장되어 버려서, 나중에 다시 불러올 때 Unnamed: 0 같은 지저분한 열이 생기게 됩니다.

[코드 & 실행 값]

Python
# 인덱스 번호는 빼고 순수 데이터만 깔끔하게 CSV 파일로 저장하기
df_filled.to_csv('MyNewCSVFileNoIndex.csv', index=False)

# 저장된 파일을 다시 불러와서 잘 저장되었는지 확인해볼까요?
final_df = pd.read_csv('MyNewCSVFileNoIndex.csv')
print(final_df)

실행 결과:

Plaintext
# 내 폴더에 'MyNewCSVFileNoIndex.csv' 파일이 깔끔하게 생성됩니다!
       Name     City      Country
0  Schiphol  Unknown  Netherlands

파라미터 명 기본값 의미 및 사용법 실무 활용 팁 💡
path_or_buf (필수) 저장할 **파일의 이름(경로)**을 지정합니다. 'data.csv' 처럼 파일명과 확장자를 문자열로 적어줍니다.
index True 데이터프레임의 **행 인덱스(0, 1, 2...)**를 저장할지 결정합니다. 이전 시간에 배웠듯, 특별한 이유가 없다면 **index=False**로 두는 것이 깔끔합니다.
header True 데이터프레임의 **열 이름(컬럼명)**을 저장할지 결정합니다. 컬럼명 없이 데이터만 저장하고 싶다면 False로 설정합니다.
sep ',' 데이터를 구분할 **구분자(Separator)**를 지정합니다. 기본은 쉼표입니다. 탭(Tab)으로 구분하고 싶다면 sep='\t' (이 경우 파일 확장자는 주로 .tsv를 씁니다)를 사용합니다.
na_rep '' (빈칸) **결측치(NaN)**를 어떤 문자로 바꿔서 저장할지 지정합니다. 빈칸 대신 명시적으로 na_rep='누락됨' 이나 na_rep='Unknown'으로 적어주면 나중에 알아보기 편합니다.
encoding None 파일의 문자 인코딩 방식을 지정합니다. (한글 깨짐 방지!) 윈도우 엑셀에서 한글이 깨진다면 encoding='utf-8-sig' 또는 **encoding='cp949'**를 사용해 보세요! (한국인 필수 파라미터 🇰🇷)
columns None 특정 열(Column)만 골라서 저장하고 싶을 때 사용합니다. columns=['Name', 'City'] 처럼 리스트 형태로 전달하면 원하는 열만 저장됩니다.

 

 

 

💡 튜터의 마무리 팁!

영상 마지막 쯤에 강사님이 아주 좋은 팁을 주셨어요. to_csv()나 read_csv()에는 제가 오늘 설명해 드린 것 외에도 수많은 옵션이 존재합니다. (예: 한글이 깨질 때 쓰는 encoding='utf-8', 탭으로 구분할 때 쓰는 sep='\t' 등)

코딩하다가 "어? 이런 기능도 있을까?" 싶을 때는 언제든 ChatGPT에게 "Python Pandas to_csv() 메서드의 상세한 파라미터를 알려줘"라고 질문해보세요! 엄청난 속도로 발전하실 수 있을 거예요.

오늘 수업은 여기까지입니다. 혹시 코드 중에 이해가 안 가거나, 본인의 환경에서 에러가 나는 부분이 있다면 언제든 다시 질문해 주세요! 화이팅입니다! 🚀

반응형