파이썬 pandas 데이터 분석 입문 · 5장
결측치·중복 처리와 자료형 변환
isna·fillna·dropna, drop_duplicates, astype, to_datetime, .str 문자열 정리
현실의 데이터는 깨끗하지 않습니다. 빈 값, 중복 행, 문자열로 들어온 날짜를 고치는 데이터 전처리는 분석 시간의 상당 부분을 차지합니다. 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도 같은 방식으로 씁니다.