[Pandas] dropna / fillna
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.0fillna 기본
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]| index | original | ffill | bfill |
|---|---|---|---|
| 0 | 1.0 | 1.0 | 1.0 |
| 1 | NaN | 1.0 | 4.0 |
| 2 | NaN | 1.0 | 4.0 |
| 3 | 4.0 | 4.0 | 4.0 |
| 4 | NaN | 4.0 | 6.0 |
| 5 | 6.0 | 6.0 | 6.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 여부 ( 별칭) | …
💬 댓글