판다스 결측치, 개념을 알아야 AI에게 제대로 시킬 수 있다 — 5단계 처리 흐름 완전 정복

데이터를 다루기 시작하면 가장 먼저 마주치는 게 판다스 결측치다. 수집된 데이터가 깨끗한 경우는 거의 없다. NaN이 섞여 있고, None이 들어있고, 어떤 컬럼은 절반 이상이 비어 있다. 이 상태로 분석을 돌리면 결과가 틀리거나 에러가 난다.

요즘은 AI에게 코드를 요청하는 방식으로 작업하는 사람이 많다. 그런데 개념을 모르면 AI에게 정확히 요청하기 어렵다. “결측치 처리해줘”라고 하면 AI는 뭔가를 만들어주지만, 그게 내 데이터에 맞는 처리인지 판단할 수 없다. 이 글은 코드를 외우는 게 목적이 아니다. 각 함수가 무엇을 하는지, 언제 어떤 판단 기준으로 쓰는지를 잡아두면 AI에게 훨씬 정확한 요청을 할 수 있다.

판다스 결측치란 — NaN, None, NA 3가지 차이

판다스 결측치는 하나의 이름으로 불리지만 실제로는 세 가지 형태로 들어온다.

표현의미주로 발생하는 상황
NaN값이 존재하지만 비어있는 상태float 계산 실패, 데이터 병합 후 누락
None애초에 존재하지 않는 값object 타입 컬럼, 수동 입력 누락
NApandas 내부 결측치 표현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%를 초과하는 컬럼 리스트 뽑고, 그 컬럼들을 제거하는 코드 만들어줘”

판다스 결측치 처리 개념 — AI에게 정확하게 요청하는 법

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에서 확인할 수 있다.

FAQ

결측치 처리 후에도 결과가 이상하다면 세 가지를 순서대로 확인한다. 첫째, 처리 결과를 저장했는지 확인한다 — dropna()fillna()는 일회성이라 재할당하지 않으면 원본이 그대로다. 둘째, 빈 문자열("")이나 공백( )이 결측치처럼 보이지만 isna()에 잡히지 않는 경우가 있다. 셋째, 대체값이 분포를 왜곡했을 가능성이 있다 — 이상치가 섞인 데이터에 평균값을 채우면 분석 결과가 틀어진다. AI에게 “결측치 처리 전후 기초통계량을 비교해줘”라고 요청하면 어디서 틀어졌는지 빠르게 파악할 수 있다.

컬럼 성격을 먼저 분류해서 요청하는 게 가장 정확하다. 예를 들어 “수치형 컬럼은 중앙값으로 채우고, 범주형 컬럼은 최빈값으로 채우고, 시계열 컬럼은 ffill로 처리해줘”처럼 컬럼 타입별 처리 방식을 함께 명시하면 AI가 각 컬럼에 맞는 코드를 한 번에 만들어준다. 개념 없이 “결측치 처리해줘”만 하면 AI는 전체를 평균값으로 일괄 처리하는 코드를 줄 가능성이 높다.

데이터가 단순할수록 확인 단계를 건너뛰고 싶어지는데, 그때 실수가 생긴다. 최소한 1단계(결측치 현황 파악)와 마지막 검증 단계는 데이터 크기와 상관없이 생략하지 않는 게 좋다. 처리 전후 행 수나 컬럼 수가 예상과 다르다면 어딘가 잘못된 것이다. AI에게 코드를 받았을 때도 결과물에 “처리 전후 건수를 함께 출력해줘”를 붙여두면 검증을 자동화할 수 있

관련 글 보기