본문으로 건너뛰기
김신건의 로그

[Pandas] dropna / fillna

· 수정 · 📖 약 1분 · 220자/단어 #python #pandas #null #missing-data
Pandas dropna, Pandas fillna, Pandas dropna / fillna, 결측치 처리, NaN 처리

정의

  • dropna() : NaN 이 있는 행/열 제거
  • fillna() : NaN 을 특정 값으로 대체

데이터 분석의 가장 기본적인 결측치 처리.

dropna 기본

df.dropna()                    # 어느 컬럼이든 NaN 있는 행 제거
df.dropna(how='all')           # 모든 컬럼이 NaN 인 행만
df.dropna(subset=['col1'])      # 특정 컬럼만 검사
df.dropna(axis=1)              # NaN 있는 열 제거
df.dropna(thresh=3)            # NaN 이 아닌 값이 3 개 이상인 행만
python
import pandas as pd
import numpy as np
df = pd.DataFrame({
  'a': [1, np.nan, 3, 4],
  'b': [np.nan, 2, 3, 4],
  'c': [10, 20, np.nan, 40],
})
print(df)
print('--- dropna() ---')
print(df.dropna())
결과
     a    b     c
0  1.0  NaN  10.0
1  NaN  2.0  20.0
2  3.0  3.0   NaN
3  4.0  4.0  40.0
--- dropna() ---
   a    b     c
3  4.0  4.0  40.0

fillna 기본

df.fillna(0)                     # 모든 NaN → 0
df.fillna({'a': 0, 'b': 'unknown'})  # 컬럼별 다른 값
df.fillna(method='ffill')         # forward fill (이전 값으로)
df.fillna(method='bfill')         # backward fill (다음 값으로)
df['salary'].fillna(df['salary'].mean())   # 평균으로

IMPORTANT

pandas 2.2+ 에서 method='ffill' / 'bfill' 는 deprecated. 새 코드는 df.ffill(), df.bfill() 직접 호출 권장.

ffill / bfill 시각화

python
s = pd.Series([1, np.nan, np.nan, 4, np.nan, 6])
print('original:', s.tolist())
print('ffill   :', s.ffill().tolist())
print('bfill   :', s.bfill().tolist())
결과
original: [1.0, nan, nan, 4.0, nan, 6.0]
ffill   : [1.0, 1.0, 1.0, 4.0, 4.0, 6.0]
bfill   : [1.0, 4.0, 4.0, 4.0, 6.0, 6.0]
indexoriginalffillbfill
01.01.01.0
1NaN1.04.0
2NaN1.04.0
34.04.04.0
4NaN4.06.0
56.06.06.0

컬럼별 다양한 전략

# 수치형은 평균, 범주형은 'unknown'
fills = {
    'age': df['age'].mean(),
    'salary': df['salary'].median(),
    'city': 'unknown',
    'note': '',
}
df = df.fillna(fills)

groupby + fillna (그룹 평균으로 채우기)

df['salary'] = df.groupby('dept')['salary'].transform(
    lambda s: s.fillna(s.mean())
)

각 부서의 평균으로 그 부서의 NaN 채우기.

함정

1. dropna 가 너무 공격적

df.dropna()           # 어느 컬럼이든 NaN 있으면 제거 → 행이 거의 안 남을 수 있음
df.dropna(subset=['중요컬럼'])   # 그 컬럼만 검사

2. inplace=True 의 안 좋은 습관

df.dropna(inplace=True)        # 권장 안 함
df = df.dropna()               # ✓ 명시적

3. fillna 의 한계

df['age'].fillna(df['age'].mean())
# NaN 비율이 높으면 평균이 의미를 잃음
# 더 정교한 imputation 은 scikit-learn 의 SimpleImputer, KNNImputer 등

4. NA dtype 의 처리

pandas 1.x+ 의 nullable dtype (Int64, boolean 등) 에서는 np.nan 대신 pd.NA 가 사용됨. fillna(0) 은 둘 다 처리.

참고

이 글의 용어 (3개)
[Pandas] groupbypandas
정의 는 데이터를 그룹으로 나누고 (split), 각 그룹에 함수를 적용 (apply), 결과를 합쳐 (combine) 새 DataFrame 으로 만드는 split-apply-c…
[Pandas] interpolatepandas
정의 는 NaN 을 주변 값을 사용해 보간 으로 채운다. 시계열, 측정 데이터의 작은 결측을 자연스럽게 채울 때 유용. 기본 linear 보간 예 <CodeWithOutput l…
[Pandas] isin / isna / notnapandas
정의 | 메서드 | 의미 | |:---|:---| | | 각 원소가 values 안에 있는지 (boolean Series) | | | NaN/NaT/None 여부 ( 별칭) | …

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기