데이터를 다루기 시작하면 가장 먼저 마주치는 게 판다스 결측치다. 수집된 데이터가 깨끗한 경우는 거의 없다. NaN이 섞여 있고, None이 들어있고, 어떤 컬럼은 절반 이상이 비어 있다. 이 상태로 분석을 돌리면 결과가 틀리거나 에러가 난다.
요즘은 AI에게 코드를 요청하는 방식으로 작업하는 사람이 많다. 그런데 개념을 모르면 AI에게 정확히 요청하기 어렵다. “결측치 처리해줘”라고 하면 AI는 뭔가를 만들어주지만, 그게 내 데이터에 맞는 처리인지 판단할 수 없다. 이 글은 코드를 외우는 게 목적이 아니다. 각 함수가 무엇을 하는지, 언제 어떤 판단 기준으로 쓰는지를 잡아두면 AI에게 훨씬 정확한 요청을 할 수 있다.
판다스 결측치란 — NaN, None, NA 3가지 차이
판다스 결측치는 하나의 이름으로 불리지만 실제로는 세 가지 형태로 들어온다.
| 표현 | 의미 | 주로 발생하는 상황 |
|---|---|---|
NaN | 값이 존재하지만 비어있는 상태 | float 계산 실패, 데이터 병합 후 누락 |
None | 애초에 존재하지 않는 값 | object 타입 컬럼, 수동 입력 누락 |
NA | pandas 내부 결측치 표현 | pandas 자체 처리 시 |
isna()는 세 가지를 모두 잡아내므로 실무에서는 큰 구분 없이 처리하면 된다. 다만 dropna()로 제거해도 결측치가 남는다면 None 또는 빈 문자열("")로 들어온 경우가 많다. AI에게 요청할 때 이 차이를 언급하면 훨씬 정확한 처리 코드를 받을 수 있다.
💬 AI 프롬프트 예시 “df에 NaN, None, 빈 문자열이 섞여 있어. 세 가지를 모두 결측치로 처리하는 코드 만들어줘”
결측치를 확인하는 방법 — 처리 전 현황 파악이 먼저다
무엇을 처리할지 모르는 상태에서 시작하면 실수가 생긴다. 결측치 처리 전에 반드시 현황을 먼저 파악해야 한다.
isna()는 결측치 위치를 True/False로 반환한다. 여기에 sum()을 붙이면 컬럼별 결측치 개수가 나오고, sum()을 한 번 더 붙이면 전체 개수가 나온다. info()는 전체 행 수 대비 각 컬럼의 non-null 개수를 한눈에 보여준다. 6만 개 데이터에서 특정 컬럼의 non-null이 5만 9천 개라면, 나머지 1천 개가 결측치라는 의미다.
df.isna().sum()
확인 단계에서 중요한 건 숫자가 아니라 패턴이다. 특정 컬럼에 결측치가 몰려있는지, 아니면 전체적으로 퍼져있는지에 따라 처리 방향이 달라진다.
💬 AI 프롬프트 예시 “df의 컬럼별 결측치 개수와 비율을 보기 좋게 정리해줘”
dropna — 결측치 행을 제거할 때의 판단 기준
dropna()는 결측치가 포함된 행을 제거한다. 기본값은 how='any'로, 하나의 컬럼에만 결측치가 있어도 그 행 전체가 삭제된다. 데이터 양이 충분하고 해당 행이 분석에 크게 영향을 주지 않을 때 쓴다.
df = df.dropna(subset=['컬럼명'])
dropna()는 일회성이다. 저장하지 않으면 원본은 그대로다. df = df.dropna()처럼 재할당해야 실제로 반영된다.
제거 전에 리스트업 먼저
무작정 지우기보다 어떤 컬럼이 대상인지 먼저 확인하는 게 좋다. 결측치 비율이 1%를 초과하는 컬럼명을 리스트로 뽑으면 중요도를 직접 판단할 수 있다.
removed_columns_list = df.columns[df.isnull().sum() / len(df) > 0.01].tolist()
print(removed_columns_list)
컬럼 이름이 눈에 보이면 “이 컬럼이 분석에 꼭 필요한가?”를 바로 판단할 수 있다. 제거는 언제든 할 수 있지만 한 번 날린 컬럼은 되돌리기 어렵다. 리스트업 → 중요도 확인 → 제거 순서가 더 안전하다.
결측치가 너무 많은 컬럼을 일괄 제거할 때는 thresh 옵션을 쓴다. 정상값이 N개 이상인 컬럼만 남기는 방식이다. 70개 컬럼 중 결측치가 과도한 컬럼 12개를 한 번에 정리할 때 유용하다.
💬 AI 프롬프트 예시 “df에서 결측치 비율이 1%를 초과하는 컬럼 리스트 뽑고, 그 컬럼들을 제거하는 코드 만들어줘”
fillna — 결측치를 대체할 때 어떤 값으로 채울 것인가
제거가 항상 답은 아니다. 데이터가 줄어들면 분석 결과가 왜곡될 수 있다. 그럴 때는 fillna()로 대체한다.
대체 방식은 세 가지다. 0 또는 특정 문자열로 채우는 방법, 평균값·중앙값으로 채우는 방법, 앞/뒤 값으로 채우는 방법이다.
어떤 값으로 채울지 판단 기준
| 상황 | 권장 대체 방식 |
|---|---|
| 결측치가 “없음”을 의미하는 경우 | 0 또는 특정 문자열 |
| 분포가 고른 수치 데이터 | 평균값 |
| 이상치가 많거나 분포가 치우친 경우 | 중앙값 |
| 시계열·센서 데이터 | 앞/뒤 값 (ffill/bfill) |
평균값은 이상치에 민감하다. 분포가 한쪽으로 치우쳐 있다면 평균보다 중앙값이 더 안전하다. 센서 데이터처럼 시간 흐름이 있는 경우는 결측치 앞뒤의 값이 가장 현실에 가까운 근사치다.
df['컬럼명'] = df['컬럼명'].fillna(df['컬럼명'].median())
pandas는 여러 컬럼을 한 번에 처리할 수 있어 for문 없이도 다수의 컬럼을 동시에 대체할 수 있다.
💬 AI 프롬프트 예시 “df의 수치형 컬럼에서 결측치를 각 컬럼의 중앙값으로 대체해줘. 시계열 컬럼은 ffill로 처리해줘”
이상치 처리 — 값은 있지만 신뢰할 수 없는 데이터
결측치를 정리했다면 다음은 이상치다. 값은 존재하지만 분포에서 극단적으로 벗어난 데이터를 말한다. 이상치를 그대로 두면 평균이 왜곡되고 모델 성능이 떨어진다.
이상치 처리 방법은 크게 두 가지다. 백분위수 기반과 IQR 기반이다.
백분위수 기반은 하위 1%, 상위 1%를 이상치로 보고 제거한다. 기준이 단순하고 직관적이어서 빠르게 처리할 때 쓴다.
IQR 기반은 박스플롯의 수염 범위를 기준으로 삼는다. Q1(25%)과 Q3(75%)의 차이가 IQR이고, Q1 – 1.5×IQR보다 작거나 Q3 + 1.5×IQR보다 큰 값을 이상치로 본다. 통계적으로 더 엄밀한 방법이다.
| 기준 | 공식 | 특징 |
|---|---|---|
| 백분위수 | 상위/하위 N% 기준 | 단순, 직관적 |
| IQR 하한 | Q1 – 1.5 × IQR | 통계적으로 엄밀 |
| IQR 상한 | Q3 + 1.5 × IQR | 통계적으로 엄밀 |
어떤 기준을 쓸지는 데이터 성격에 따라 다르다. 분포를 먼저 시각화해보고 판단하는 게 가장 정확하다.
💬 AI 프롬프트 예시 “df의 ‘yield_value’ 컬럼에서 IQR 기준으로 이상치를 찾아서 제거하고, 전후 데이터 건수를 출력해줘”
loc·iloc — 원하는 데이터에 정확히 접근하는 법
결측치·이상치 처리가 끝나면 원하는 데이터를 정확히 꺼낼 수 있어야 한다. loc와 iloc는 판다스에서 데이터를 선택할 때 가장 많이 쓰는 두 가지 방법이다.
| 메서드 | 기준 | 한 줄 요약 |
|---|---|---|
loc | 라벨(이름) | 행·열의 이름으로 접근 |
iloc | 정수(위치) | 행·열의 번호로 접근 |
at | 라벨 | 단일 값만, loc보다 빠름 |
iat | 정수 | 단일 값만, iloc보다 빠름 |
인덱스가 날짜나 문자열이면 loc, 순서 번호(0, 1, 2…)로 접근하고 싶으면 iloc를 쓴다. 콤마를 기준으로 앞이 행, 뒤가 열이다. 단일 값 하나만 꺼낼 때는 loc/iloc보다 at/iat가 빠르다.
df.loc['2025-01-01':'2025-01-03', ['A', 'B']]
필터링 후에는 인덱스가 0, 3, 7처럼 불연속적으로 남는다. reset_index(drop=True)로 0부터 다시 번호를 매기는 습관을 들이면 이후 인덱싱 실수를 줄일 수 있다.
💬 AI 프롬프트 예시 “df에서 날짜 인덱스 기준으로 2025-01-01부터 2025-01-03까지, A와 B 컬럼만 추출해줘”
마무리 — 개념이 있어야 AI를 제대로 쓸 수 있다
판다스 결측치 처리는 흐름이 중요하다. 확인 → 리스트업 → 제거 또는 대체 → 이상치 처리 → 인덱싱 순서를 이해하면, AI에게 단계별로 정확하게 요청할 수 있다.
결측치 현황 파악 (isna / info)
↓
결측치 컬럼 리스트업 → 중요도 판단
↓
제거 (dropna) 또는 대체 (fillna)
↓
이상치 확인 및 제거 (quantile / IQR)
↓
인덱스 재정렬 (reset_index)
↓
검증 (len / info로 개수 확인)
코드를 외우는 것보다 “지금 내 데이터에 어떤 처리가 필요한가”를 판단하는 능력이 더 중요하다. 개념이 명확하면 AI에게 요청하는 프롬프트도 명확해지고, 받은 결과를 검증하는 눈도 생긴다. 판다스 결측치 처리는 그 출발점이다.
[링크 제안]
결측치를 정리했다면 다음은 원하는 데이터를 정확히 꺼내는 일이다. loc, iloc 외에 불리언 필터링과 조건부 값 치환까지 한 번에 잡아두자.
DataFrame 전체 작업 흐름이 한눈에 보고 싶다면 이 글에서 생성부터 삭제까지 5단계 구조를 확인할 수 있다.
pandas 결측치 처리의 더 다양한 옵션은 pandas 공식 문서 — Working with missing data에서 확인할 수 있다.







