5 / 8

파이썬 pandas 데이터 분석 입문 · 5장

결측치·중복 처리와 자료형 변환

isna·fillna·dropna, drop_duplicates, astype, to_datetime, .str 문자열 정리

3분 읽기

현실의 데이터는 깨끗하지 않습니다. 빈 값, 중복 행, 문자열로 들어온 날짜를 고치는 데이터 전처리는 분석 시간의 상당 부분을 차지합니다. 3장에서 읽은 raw를 정리해 봅시다.

결측치(빈 값) 찾기 — isna

Pythondf = raw.copy()        # 원본은 그대로 두고 복사본을 고칩니다
df.isna().sum()
결과date     0
store    0
menu     0
qty      1
price    0
dtype: int64

중복 행 지우기 — drop_duplicates

Pythondf.duplicated().sum()     # 1
df = df.drop_duplicates()

duplicated는 앞에서 이미 나온 행과 모든 열이 같은 행을 찾습니다. 특정 열만 기준으로 삼으려면 drop_duplicates(subset=['date', 'store', 'menu'])처럼 씁니다.

결측치 채우거나 지우기 — fillna, dropna

빈 값을 다루는 방법은 크게 두 가지입니다.

  • 지우기: df.dropna() — 빈 값이 있는 행을 뺍니다. 빈 값이 아주 적을 때 간단합니다.
  • 채우기: df['qty'].fillna(값) — 평균, 중앙값, 0 같은 값으로 채웁니다.

판매 수량처럼 치우친 값이 있을 수 있는 숫자는 평균보다 중앙값으로 채우는 편이 안전합니다.

Pythondf['qty'] = df['qty'].fillna(df['qty'].median())

자료형 바꾸기 — astype, to_datetime

빈 값이 사라졌으니 qty를 정수로, 문자열인 date를 날짜형으로 바꿉니다.

Pythondf['qty'] = df['qty'].astype(int)
df['date'] = pd.to_datetime(df['date'])
df.dtypes
결과date     datetime64[ns]
store            object
menu             object
qty               int64
price             int64
dtype: object

날짜형이 되면 .dt로 연, 월, 요일 같은 정보를 꺼낼 수 있습니다.

Pythondf['weekday'] = df['date'].dt.day_name()
df.reset_index(drop=True)
결과        date store        menu  qty  price    weekday
0 2026-03-01  강남  아메리카노   30   4500     Sunday
1 2026-03-01  홍대        라떼   12   5000     Sunday
2 2026-03-02  강남        라떼   18   5000     Monday
3 2026-03-02  홍대  아메리카노   15   4500     Monday
4 2026-03-03  강남  아메리카노   28   4500    Tuesday
5 2026-03-03  홍대      케이크    7   6500    Tuesday
6 2026-03-04  강남      케이크    9   6500  Wednesday
7 2026-03-04  홍대        라떼   15   5000  Wednesday

빈 값이던 3번 행의 수량이 중앙값 15로 채워졌고, 중복 행은 사라져 8행이 되었습니다.

문자열 정리하기 — .str

사람이 입력한 데이터에는 공백이나 대소문자가 섞여 있기 마련입니다. 문자열 열은 .str로 한꺼번에 다듬습니다.

Pythonnames = pd.Series(['  Latte', 'americano ', 'LATTE'])
names.str.strip().str.lower()
결과0        latte
1    americano
2        latte
dtype: object

str.replace, str.contains, str.split도 같은 방식으로 씁니다.

전체 메뉴