Pandas 결측치 처리 (dropna, fillna)

Pandas의 dropnafillna 메서드를 사용하여 데이터프레임 내의 결측치를 효과적으로 처리할 수 있으며, 이를 통해 데이터의 완전성을 유지하고 분석 결과를 더 정확하게 만들 수 있다. 이 글에서는 dropnafillna를 사용한 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 JonsondeptNaN으로 누락된 값, 즉 결측치인것을 확인한다.

처리 방법 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 메서드는 결측치를 다른 값으로 채우는 데 사용된다. 이 메서드를 사용하면 결측치를 원하는 값으로 대체할 수 있다.

결측치를 다른 값으로 대체

다음은 ageNaN이 있으나 이 값을 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())등을 이용하여 값을 대체할 수 있다.

주의사항

  • dropnafillna 메서드는 원본 데이터프레임을 변경하지 않고, 새로운 데이터프레임을 반환한다. 따라서, 원본 데이터프레임을 변경하려면 inplace=True 옵션을 사용해야 한다.
  • 결측치 처리는 데이터 전처리 단계에서 중요한 작업 중 하나이다. 적절한 결측치 처리를 통해 데이터 분석 및 모델링 과정을 개선할 수 있다.

참조

답글 남기기