👩‍💻 Develope/Python

[Pandas] 결측값 처리

heywantodo 2024. 12. 19. 15:27
728x90
반응형

[Pandas] 결측값 처리

얼마전 데이터프레임을 다루면서, 결측치(`NaN`)가 있으면 같은 행의 데이터로 덮어씌우는 방식으로 결측치를 처리한 적이 있었다. Pandas에는 이러한 결측값을 효과적으로 처리할 수 있는 다양한 방법이 있어, 해당 방법을 정리해보고자 한다.

 

결측값 확인하기

데이터 프레임에서 결측값을 확인하는 것은 결측값 처리를 시작하는 첫 단계이다.

결측값을 확인 하기 위해 다음과 같은 메서드를 사용할 수 있다.

import pandas as pd

data = {'A': [1, 2, None], 'B': [None, 3, 4]}
df = pd.DataFrame(data)

## isnull()
# isnull() 메서드는 각 요소가 결측값인지 여부를 Boolean 값으로 반환한다.
df.isnull()

## isna()
# isna() 메서드는 isna()와 동일한 기능을 수행한다.
df.isna()

## info()
# info() 메서드는 데이터프레임의 각 열에 대한 결측값의 개수를 확인할 수 있다.
df.info()

 

결측값 제거하기

결측측 값을 제거하기 위해선 `dropna()`를 사용할 수 있다.

 

## dropna()
# dropna() 메서드는 결측값이 포함된 행 또는 열을 제거한다.
# 행 제거 : 기본적으로 결측값이 포함된 모든 행을 제거한다.
cleaned_df = df.dropna()

# 열 제거 : axis=1 옵션을 사용하여 결측값이 포함된 열을 제거한다.
cleaned_df = df.dropna(axis=1)

# thresh : 해당 매개변수를 사용하면 특정 개수 이상의 비결측값을 가진 행만 남길 수 있다.
cleaned_df = df.dropna(thresh=1) # 최소 1개의 비결측값이 있는 행만 남김

 

결측값 대체하기

결측값을 제거하는 대신 대체하는 방법도 있다.

## fillna()
# fillna() 메서드는 결측값을 특정 값으로 대체한다.
filled_df = df.fillna(0) # 결측값을 0으로 대체

# 결측값을 평균, 중앙값 또는 최빈값으로 대체할 수 있다.
mean_value = df['B'].mean()
filled_df = df['B'].fillna(mean_value)

# 이전 또는 이후 값으로 대체 할 수 있다.
filled_df = df.fillna(method='ffill') # 이전 값으로 대체
filled_df = df.fillna(method='bfill') # 이후 값으로 대체

 

결합하기

앞서 같은 행의 데이터로 덮어씌우는 방식으로 결측치를 처리를 했다고 언급했는데,

바로 `combine_first()` 메서드를 사용하여 결측치를 처리하는 방법이다.

 

해당 메서드는 두 개의 시리즈를 결합하여 결측값을 처리하는 데에 유용하다.

첫 번째 시리즈의 값이 NaN인 경우에만 두 번째 시리즈의 값을 사용한다.

s1 = pd.Series([1, 2, None, 4])
s2 = pd.Series([None, 3, 5, None])

result = s1.combine_first(s2)
print(result)

## 결과
0    1.0
1    2.0
2    5.0
3    4.0
dtype: float64

 

728x90
반응형