본문 바로가기
[업무 지식]/Python

[결측값 처리] python 기초

by 에디터 윤슬 2024. 11. 7.

 

결측값 비율 확인 및 시각화 함수

 
import pandas as pd
import matplotlib.pyplot as plt

def missing_per(df):
    null_data = []  # 빈 리스트로 시작하여 각 컬럼의 결측값 정보를 저장합니다.
    for col in df.columns:
        null_rate = df[col].isna().sum() / len(df) * 100
        if null_rate > 0:
            print('{} null rate: {}%'.format(col, round(null_rate, 2)))
            # null_data에 딕셔너리 형태로 추가
            null_data.append({'column': col, 'null_rate': null_rate})

    # DataFrame 생성
    df_null = pd.DataFrame(null_data)

    # 막대 그래프 생성
    plt.figure(figsize=(10, 6))
    plt.bar(df_null['column'], df_null['null_rate'], color='skyblue')

    # 그래프 꾸미기
    plt.title('Null Rate by Column', fontsize=16)
    plt.xlabel('Column', fontsize=14)
    plt.ylabel('Null Rate (%)', fontsize=14)
    plt.xticks(rotation=45)
    plt.ylim(0, max(df_null['null_rate']) + 5)  # Y축 범위 설정

    # 각 막대 위에 비율 표시
    for index, value in enumerate(df_null['null_rate']):
        plt.text(index, value + 0.5, f'{round(value, 2)}%', ha='center', va='bottom')

    plt.tight_layout()
    plt.show()

missing_per(df)

 

 

결측치 제거 - 열 제거하기

 
# 결측치 제거 - 열 전체 제거
df = df.drop('Unnamed: 4', axis = 1)

 

컬럼별 결측치 확인

 
df.isnull().sum()
df.isna().sum()

 

# 결측값

for i in df.columns:
    null_rate = df[i].isna().sum() / len(df) * 100
    if null_rate > 0:
        print('{} null rate: {}%'.format(i, round(null_rate, 2)))

 

결측치가 있는 행 제거

 
df = df.dropna(inplace = True)
특정 컬럼에 해당하는 결측치 행 제거
df = df.dropna(subset=['column']).reset_index(drop=True)

결측값 -> 최빈값 대체

 
# 결측치가 있는 Interaction type 컬럼을 최빈값으로 대체하기 위해, mode() 함수 사용
df['Interaction type'].mode()
# mode 함수의 output은 시리즈
# 따라서 [0]을 통해 시리즈 중 단일값을 가져온다

df = df['Interaction type'].fillna(df['Interaction type'].mode()[0])
# 연산 후 인덱스 재설정
df = df.reset_index()

결측값 -> 평균, 중앙값 대체

 
# Shipping Weight 컬럼의 값 {10.7 pounds, 8.9 pounds .....}

# 문자열 분리
df['sw'] = df['Shipping Weight'].str.split().str[0]

# string to float, 에러 무시
# "."을 처리하기 위해 에러 무시 적용
df['sw'] = pd.to_numeric(df['sw'], errors = 'coerce')
# 평균값 대체
df['sw'] = df['sw'].fillna(df['sw'].mean())

# 중간값 대체
df['sw'] = df['sw'].fillna(df['sw'].median())

# 바로 위 값으로 대체
df['sw'] = df['sw'].fillna(method = 'ffill')

# 바로 아래 값으로 대체
df['sw'] = df['sw'].fillna(method = 'bfill')

 

결측치 대체_group by

 
# 사전 데이터 확인
df.groupby('Category')['sw'].median()
# groupby 데이터를 데이터프레임의 컬럼으로 추가하기 위해 transform() 함수 사용
df['sw'] = df['sw'].fillna(df.groupby('Category')['sw'].transform('median'))

 

'[업무 지식] > Python' 카테고리의 다른 글

[2차원 배열 저장] for문  (0) 2024.11.21
[이상치 처리] Python  (0) 2024.11.07
[seaborn] 데이터 시각화  (0) 2024.10.31
[matplotlib] 데이터시각화  (0) 2024.10.31
[10분 판다스] python 기초  (0) 2024.10.31