1. CSV 파일 읽어오기 (read_csv)
[이론] CSV(Comma-Separated Values)는 데이터를 쉼표(,)로 구분하여 저장한 파일 형식이에요. 머신러닝이나 데이터 분석에서 가장 많이 쓰이는 기본 포맷이죠. Pandas에서는 pd.read_csv() 함수를 사용해 이 파일을 '데이터프레임(DataFrame)' 형태로 아주 쉽게 불러올 수 있습니다
[코드 & 실행 값]
import pandas as pd
# 1. 정상적인 CSV 파일 읽어오기
airports_df = pd.read_csv('airports.csv')
print(airports_df)
실행 결과:
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번째 줄을 제외하고 불러올 수 있다.
[코드 & 실행 값]
# 에러가 있는 줄은 건너뛰고 불러오기
df_invalid = pd.read_csv('invalid_rows.csv', on_bad_lines='skip')
print(df_invalid)
실행 결과:
# 에러가 발생한 라인은 스킵되고 나머지 데이터만 정상 출력됩니다.
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 옵션을 통해 우리가 직접 리스트 형태로 컬럼명을 지어주면 됩니다.
[코드 & 실행 값]
# 첫 줄이 컬럼으로 들어가지 않게 막고, 직접 컬럼명 지정하기
column_names = ['Name', 'City', 'Country']
df_no_header = pd.read_csv('no_header.csv', header=None, names=column_names)
print(df_no_header)
실행 결과:
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으로 표시되는 것을 확인했습니다.
하지만 실제 코딩에서는 이 빈칸을 그대로 두지 않고 채우거나 지우는 작업이 필수입니다! 제가 추가로 빈칸을 채우는 코드를 알려드릴게요.
[코드 & 실행 값]
# 특정 값이 비어있는(NaN) 데이터프레임이 있다고 가정해볼게요.
print("--- 원본 데이터 ---")
print(df_missing)
# 빈칸(NaN)을 'Unknown'이라는 글자로 일괄 채워넣기 (보충 학습!)
df_filled = df_missing.fillna('Unknown')
print("\n--- 빈칸 채운 데이터 ---")
print(df_filled)
실행 결과:
--- 원본 데이터 ---
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 같은 지저분한 열이 생기게 됩니다.
[코드 & 실행 값]
# 인덱스 번호는 빼고 순수 데이터만 깔끔하게 CSV 파일로 저장하기
df_filled.to_csv('MyNewCSVFileNoIndex.csv', index=False)
# 저장된 파일을 다시 불러와서 잘 저장되었는지 확인해볼까요?
final_df = pd.read_csv('MyNewCSVFileNoIndex.csv')
print(final_df)
실행 결과:
# 내 폴더에 '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() 메서드의 상세한 파라미터를 알려줘"라고 질문해보세요! 엄청난 속도로 발전하실 수 있을 거예요.
오늘 수업은 여기까지입니다. 혹시 코드 중에 이해가 안 가거나, 본인의 환경에서 에러가 나는 부분이 있다면 언제든 다시 질문해 주세요! 화이팅입니다! 🚀
'두두 IT > 머신런닝(ML)' 카테고리의 다른 글
| scikit-learn으로 선형회귀(linear regression) 모델 머신러닝 트레이닝 수행 (1) | 2026.05.17 |
|---|---|
| scikit-learn으로 트레이닝 데이터와 테스트 데이터 분할 (0) | 2026.05.17 |
| 중복데이터와 결측값(missing value) 처리 (0) | 2026.05.17 |
| Pandas DataFrame 컬럼(column) 분할(split)과 삭제(remove) (0) | 2026.05.17 |
| 머신러닝 전체 프로세스 (1) | 2026.05.15 |