본문 바로가기

Python/Pandas

ChatGPT로 Python pandas 알아보기 (7):결측치 처리

반응형

ChatGPT로 Python pandas 알아보기 (7):결측치 처리

이번 포스트에서는 ChatGPT에게 pandas 라이브러리에서 '결측치 처리'에 관한 내용을 출력해달라 하고 해당 내용을 정리해보려 한다.
결측치(missing data)는 흔히 발생하는 문제로 이를 적절히 처리하지 않으면 분석 결과에 큰 영향을 미칠 수 있다.
이번 포스트에서 사용할 테스트 데이터는 아래와 같으며, nan을 사용하기 위해 numpy도 함께 import한다.
import pandas as pd
import numpy as np

data = {
    '이름': ['철수', '영희', '민수', '수진', '호영'],
    '나이': [28, np.nan, 35, np.nan, 22],
    '성별': ['남', '여', '남', '여', '남'],
    '지역': ['서울', '대전', '부산', np.nan, '광주']
}

df = pd.DataFrame(data)


결측치 확인:isna() / isnull()
데이터에 결측치가 있는지 확인하는 방법은 isna() 혹은 isnull() 메서드를 사용할 수 있다.
이 두 메서드는 데이터프레임 내의 각 원소가 결측치인지 아닌지를 불리언(Boolean) 형태로 표시해준다.
✔ isna()
# 결측치 확인 isna()
df.isna()
▶ 출력 결과
isna
# 나이에 결측치가 있는 데이터만 확인
df[df['나이'].isna()
▶ 출력 결과
✔ isnull()
# 결측치 확인 isna()
df.isnull()
▶ 출력 결과
isnull
isna와 isnull 이 두 메서드는 기능적으로 동일하며, 서로 다른 이름으로 같은 기능을 제공한다.
pandas는 사용자의 편의를 위해 이렇게 두 가지 이름으로 동일한 기능을 제공한다고 한다.
어떤 사람들은 결측치를 'NA'라고 부르기 때문에 isna를 선호하고, 또 다른 사람들은 'null'이라는 용어를 사용하기 때문에 isnull을 선호해서 동일한 기능을 하지만 이름만 다르게 만든 것이라고 한다.
이후 예시에서는 모두 isna를 사용하겠다.
✔ # 각 컬럼별 결측치 개수 확인
데이터프레임 내에서 결측치의 개수를 세는 경우, isna(isnull) 메서드를 사용한 후 sum 메서드를 추가적으로 사용할 수 있다.
# 각 컬럼별 결측치 개수 확인
df.isna().sum()
▶ 출력 결과
isna().sum()
✔ # 결측치가 있는 행만 선택
any(axis=1) 메서드를 사용해서 결측치가 있는 행만 선택할 수 있다.
# 결측치가 있는 행만 선택
missing_rows = df[df.isna().any(axis=1)]
▶ 출력 결과
any(axis=1)


결측치 제거:dropna()
dropna 메서드는 DataFrame이나 Series에서 결측치를 포함하는 행이나 열을 제거하는데 사용된다.
dropna 메서드를 매개변수 없이 사용하면, 결측치를 포함하는 모든 행을 제거한다.
# 결측치를 포함하는 행 제거
new_df = df.dropna()
▶ 출력 결과
nan 값이 있던 2's이 삭제된 데이터 프레임
✔ axis 매개변수
axis 매개변수를 사용하여 행(axis=0) 또는 열(axis=1)을 기준으로 결측치를 제거할 수 있다. (default=0)
# 결측치를 포함하는 열 제거
new_df = df.dropna(axis=1)
▶ 출력 결과
nan이 있던 컬럼이 삭제된 데이터프레임
✔ how 매개변수
how 매개변수'any' 또는 'all' 값을 가질 수 있으며, 결측치 제거 조건을 설정한다.

any 결측치가 하나라도 있는 행 또는 열을 제거 (기본값)
all 모든 값이 결측치인 행 또는 열을 제거합니다.
# 결측치가 하나라도 있는 행 제거
new_df = df.dropna(how='any')
▶ 출력 결과
how='any'
# 모든 값이 결측치인 행만 제거
new_df = df.dropna(how='all')
▶ 출력 결과
how='all'
✔ subset 매개변수
subset 매개변수를 사용하여 특정 열에 대해서만 결측치를 검사하고 제거할 수 있다.
# '나이' 열에서 결측치를 포함하는 행만 제거
new_df = df.dropna(subset=['나이'])
▶ 출력 결과
subset
✔ inplace 매개변수
inplace 매개변수를 True로 설정하면, 원본 DataFrame을 변경하고 새로운 DataFrame을 반환하지 않는다.
# 원본 DataFrame 변경
df.dropna(inplace=True)
▶ 출력 결과
원본 데이터프레임인 df에 dropna(inplace=True)를 하고 df를 출력했을 때


결측치 대체:fillna()
fillna는 DataFrame이나 Series에서 결측치 (NaN)를 특정 값으로 대체하는데 사용된다.
이 메서드는 데이터 정제 과정에서 결측치를 다루는 데 매우 유용하다.
결측치를 제거하는 대신, 이를 적절한 값으로 대체하여 데이터를 보존할 수 있다.
# 결측치를 0으로 대체
new_df = df.fillna(0)
▶ 출력 결과
nan을 0으로 대체
✔ axis 매개변수
axis 매개변수를 사용하여 행(axis=0) 또는 열(axis=1)을 기준으로 결측치를 채울 방향을 지정할 수 있다. (Default=0)
# 열 방향으로 이전 값으로 결측치 채우기
new_df = df.fillna(method='ffill', axis=1)
▶ 출력 결과
열방향 기준으로 결측치를 이전 값으로 변경
✔ method 매개변수
method 매개변수를 사용하여 결측치를 이전 값이나 다음 값으로 채울 수 있다.

ffill 이전 값
bfill 다음 값
# 이전 값으로 결측치 채우기
new_df = df.fillna(method='ffill')
▶ 출력 결과
method='ffill'
# 다음 값으로 결측치 채우기
new_df = df.fillna(method='bfill')
▶ 출력 결과
method='bfill'
✔ Dictionary 사용
열마다 다른 값을 사용하여 결측치를 대체하려면 dictionary를 사용할 수 있다.
dictionary의 키는 열 이름이고 값은 대체할 값이다.
# 열마다 다른 값으로 결측치 대체
values = {'나이': 30, '지역': '알 수 없음'}
new_df = df.fillna(values)
▶ 출력 결과
나이의 nan은 30으로, 지역의 nan은 '알 수 없음'으로 변경
✔ limit 매개변수
limit 매개변수를 사용하여 연속적인 결측치를 대체하는 최대 횟수를 지정할 수 있다.
# 최대 1개의 연속적인 결측치만 대체
new_df = df.fillna(0, limit=1)
▶ 출력 결과
limit=1
✔ inplace 매개변수
inplace 매개변수True로 설정하면, 원본 DataFrame을 변경하고 새로운 DataFrame을 반환하지 않는다.
# 원본 DataFrame 변경
df.fillna(0, inplace=True)
▶ 출력 결과
원본 데이터프레임 df의 결측치를 fillna(0, inplace=True)로 변경한 후 df를 출력했을 때
오늘은 pandas에서 결측치(na/nan/null)를 다루는 메서드들에 대해서 알아보았다.
메서드들은 알고 있는 것이 많았는데, isnull이 완전히 isna와 동일하다는 것은 이제서야 알게 됐다.
또 dropna와 fillna에 매개변수들도 다양한 것이 있다는 것도 이번에 알게 됐다.
글로 정리하면서 여러모로 재미있는 시간이었다.
반응형

loading