1장. 머신러닝 프로세스와 기본 개념
실습 2 — 빈칸·실수·중복 고치고 저장하기
실습 1에서 찾은 흠을 차례로 고치고, 고친 표를 out_delivery_clean.csv 로 저장합니다. 실습 3부터는 이 파일을 읽습니다.
1단계. 두 번 들어간 행 지우기
import pandas as pd
df = pd.read_csv("delivery.csv")
print("고치기 전:", df.shape)
# drop_duplicates() 는 같은 행 가운데 첫 행만 남기고 나머지를 지운 새 표를 돌려준다
df = df.drop_duplicates()
print("중복을 지운 뒤:", df.shape)고치기 전: (1215, 10)
중복을 지운 뒤: (1200, 10)2단계. 입력 실수 행 빼기
# 거리가 9999 보다 작은 행만 남긴다(조건으로 행 고르기)
# .copy() 는 고른 행을 새 표로 떼어 둔다. 없으면 뒤에서 열을 고칠 때 pandas 가 경고를 낸다
df = df[df["거리km"] < 9999].copy()
print("입력 실수를 뺀 뒤:", df.shape)입력 실수를 뺀 뒤: (1194, 10)3단계. 빈칸 채우기
# 무게: 가운데 값(중앙값)으로 채운다. 무거운 가전이 평균을 끌어올리므로 평균 대신 중앙값을 쓴다
middle = df["무게kg"].median()
df["무게kg"] = df["무게kg"].fillna(middle)
# 날씨: 글자라서 중앙값이 없다. '모름' 이라는 새 값으로 채워 빈칸이었다는 사실을 남긴다
df["날씨"] = df["날씨"].fillna("모름")
print("무게를 채운 값:", middle)
# 남은 빈칸이 0 이면 다 채운 것이다
print("남은 빈칸:", df.isna().sum().sum())무게를 채운 값: 3.0
남은 빈칸: 04단계. 저장하기
# index=False: 왼쪽의 행 번호는 저장하지 않는다
# encoding="utf-8-sig": 엑셀에서 열어도 한글이 깨지지 않게 한다
df.to_csv("out_delivery_clean.csv", index=False, encoding="utf-8-sig")
print("저장:", df.shape)저장: (1194, 10)이 실습이 뜻하는 것
이 실습은 훑어본 송장 더미를 실제로 정리하는 일과 같습니다. 두 번 꽂힌 송장을 빼고(1단계), 말이 안 되는 숫자가 적힌 송장을 빼고(2단계), 빈칸을 채운 뒤(3단계), 정리한 묶음을 새 서류철에 넣어 보관합니다(4단계). 여기서 빼는 일이 drop_duplicates 와 조건으로 행 고르기, 채우는 일이 fillna, 새 서류철이 out_delivery_clean.csv 입니다. 비유와 다른 점은, 실제 송장이라면 빈 무게를 다시 재겠지만 여기서는 가운데 값으로 짐작해 채운다는 것입니다.
| 단계 | 출력 | 뜻 |
|---|---|---|
| 1. 중복 지우기 | (1215, 10) → (1200, 10) | 행이 15개 줄었습니다. 실습 1에서 센 중복 15행이 빠진 것입니다 |
| 2. 입력 실수 빼기 | (1194, 10) | 다시 6행이 줄었습니다. 9999km 로 적힌 6행이 빠졌습니다 |
| 3. 빈칸 채우기 | 무게를 채운 값 3.0 | 빈 무게 칸을 남은 주문의 가운데 값인 3.0kg 으로 채웠습니다. 빈 날씨는 '모름' 으로 채웠습니다 |
| 3. 빈칸 확인 | 남은 빈칸 0 | 표 전체에 빈칸이 하나도 남지 않았습니다 |
| 4. 저장 | (1194, 10) | 1,194행, 10열짜리 정리된 표가 파일로 남았습니다 |
한 줄로 줄이면, 1,215행에서 흠 있는 21행(중복 15, 입력 실수 6)을 빼고 빈칸을 채워 1,194행의 깨끗한 표를 만든 실습입니다. 실습 3부터 실습 6이 이 파일을 읽습니다. 채운 3.0kg 과 '모름' 은 짐작해 넣은 값이지 실제로 잰 값이 아니라는 점은 기억해 둡니다.
코드 설명
- 1단계에서 1,215행이 1,200행이 됩니다. 실습 1에서 센 중복 15행이 빠진 것입니다.
- 2단계의
df[조건]은 조건이 True 인 행만 남깁니다. 9999km 6행이 빠져 1,194행이 됩니다. fillna(값)은 빈칸만 그 값으로 바꾸고 나머지 칸은 그대로 둡니다.- 날씨를 지우지 않고 '모름' 으로 채운 까닭은 행을 버리지 않기 위해서입니다. 행을 지우면 그만큼 기록을 잃습니다.
- 저장한 파일 이름이
out_으로 시작하는 것은 이 교안의 약속입니다. 실습이 만든 파일이라는 표시입니다.