Pandas의 dropna
와 fillna
메서드를 사용하여 데이터프레임 내의 결측치를 효과적으로 처리할 수 있으며, 이를 통해 데이터의 완전성을 유지하고 분석 결과를 더 정확하게 만들 수 있다. 이 글에서는 dropna
와 fillna
를 사용한 Pandas 결측치 처리에 대해 알아본다.
결측치 유무 및 비율 체크
데이터 분석을 시작하기 전에 각 컬럼별로 결측치의 유무 및 비율을 체크한다.
import pandas as pd
import numpy as np
data = {'id': [22317, 34342, 33253, 14643, 29453],
'name': ["Jake Smith", "Neil Miller", "Joel Harris", "Ben Baker", "Harry Johnson"],
'gender': ['M', 'M', 'M', 'F', 'M'],
'dept': ["HR", "Marketing", "Finance", "Sales", np.nan]}
df = pd.DataFrame(data)
df.info()
print(df)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id 5 non-null int64
1 name 5 non-null object
2 gender 5 non-null object
3 dept 4 non-null object
dtypes: int64(1), object(3)
memory usage: 292.0+ bytes
id name gender dept
0 22317 Jake Smith M HR
1 34342 Neil Miller M Marketing
2 33253 Joel Harris M Finance
3 14643 Ben Baker F Sales
4 29453 Harry Johnson M NaN
Heary Jonson
의 dept
가 NaN
으로 누락된 값, 즉 결측치인것을 확인한다.
처리 방법 1: 해당 row를 데이터셋에서 제외
해당 row를 데이터셋에서 제외할 때는 dropna()
를 사용하여 결측치를 삭제하는데 사용한다. 결측치를 삭제하면 해당 행 또는 열이 제거되고, 데이터프레임의 크기가 줄어든다.
결측치를 포함한 행 삭제
아래 코드는 dropna
메서드를 사용하여 결측치가 있는 행을 삭제하능 에제이다.
import pandas as pd
import numpy as np
data = {'id': [22317, 34342, 33253, 14643, 29453],
'name': ["Jake Smith", "Neil Miller", "Joel Harris", "Ben Baker", "Harry Johnson"],
'gender': ['M', 'M', 'M', 'F', 'M'],
'dept': ["HR", "Marketing", "Finance", "Sales", np.nan]}
df = pd.DataFrame(data)
# 결측치를 포함한 행 삭제
df_cleaned = df.dropna(axis=0)
print(df_cleaned)
id name gender dept
0 22317 Jake Smith M HR
1 34342 Neil Miller M Marketing
2 33253 Joel Harris M Finance
3 14643 Ben Baker F Sales
결측치를 포함한 열 삭제
axis=1
매개변수를 사용하면, 결측치를 포함한 열이 삭제된다.
import pandas as pd
import numpy as np
data = {'id': [22317, 34342, 33253, 14643, 29453],
'name': ["Jake Smith", "Neil Miller", "Joel Harris", "Ben Baker", "Harry Johnson"],
'gender': ['M', 'M', 'M', 'F', 'M'],
'dept': ["HR", "Marketing", "Finance", "Sales", np.nan]}
df = pd.DataFrame(data)
# 결측치를 포함한 열 삭제
df_cleaned = df.dropna(axis=1)
print(df_cleaned)
id name gender
0 22317 Jake Smith M
1 34342 Neil Miller M
2 33253 Joel Harris M
3 14643 Ben Baker F
4 29453 Harry Johnson M
처리 방법 2: 다른 값으로 채워 넣기
fillna
메서드
fillna
메서드는 결측치를 다른 값으로 채우는 데 사용된다. 이 메서드를 사용하면 결측치를 원하는 값으로 대체할 수 있다.
결측치를 다른 값으로 대체
다음은 age
에 NaN
이 있으나 이 값을 fillna(0)
을 사용하여 0으로 대체 하는 예제이다.
import pandas as pd
import numpy as np
data = {'id': [22317, 34342, 33253, 14643, 29453],
'name': ["Jake Smith", "Neil Miller", "Joel Harris", "Ben Baker", "Harry Johnson"],
'gender': ['M', 'M', 'M', 'F', 'M'],
'age': [43, 24, 25, 32, np.nan],
'dept': ["HR", "Marketing", "Finance", "Sales", "Merketing"]}
df = pd.DataFrame(data)
# 결측치를 0으로 대체
df['age'] = df['age'].fillna(0)
print(df)
id name gender age dept
0 22317 Jake Smith M 43.0 HR
1 34342 Neil Miller M 24.0 Marketing
2 33253 Joel Harris M 25.0 Finance
3 14643 Ben Baker F 32.0 Sales
4 29453 Harry Johnson M 0.0 Merketing
이전 값 또는 다음 값으로 대체
import pandas as pd
import numpy as np
data = {'id': [22317, 34342, 33253, 14643, 29453],
'name': ["Jake Smith", "Neil Miller", "Joel Harris", "Ben Baker", "Harry Johnson"],
'gender': ['M', 'M', 'M', 'F', 'M'],
'age': [43, 24, 25, 32, np.nan],
'dept': ["HR", "Marketing", "Finance", "Sales", "Merketing"]}
df = pd.DataFrame(data)
# 결측치를 이전 값으로 대체
df['age'] = df['age'].fillna(method='ffill')
print(df)
id name gender age dept
0 22317 Jake Smith M 43.0 HR
1 34342 Neil Miller M 24.0 Marketing
2 33253 Joel Harris M 25.0 Finance
3 14643 Ben Baker F 32.0 Sales
4 29453 Harry Johnson M 32.0 Merketing
그 밖에 평균값(mean()
)이나, 중앙값(median()
)등을 이용하여 값을 대체할 수 있다.
주의사항
dropna
및fillna
메서드는 원본 데이터프레임을 변경하지 않고, 새로운 데이터프레임을 반환한다. 따라서, 원본 데이터프레임을 변경하려면inplace=True
옵션을 사용해야 한다.- 결측치 처리는 데이터 전처리 단계에서 중요한 작업 중 하나이다. 적절한 결측치 처리를 통해 데이터 분석 및 모델링 과정을 개선할 수 있다.