MLOps 부트캠프 by 한경+토스뱅크/Python

DataFrame - 데이터 구간화(cut(), apply())

나니니 2024. 8. 4. 12:52

df.cut()

# cut()함수를 통해 데이터 구간화
patient_df['age_group'] = pd.cut(patient_df['age'], bins=[20, 30, 40, 50, 60, 70], right=False, labels=['20s', '30s', '40s', '50s', '60s'])

# 	bin: 구간화 할 범위
# 	right=False: 오른쪽 구간을 포함하지 않음(기본값은 True)
# 	labels: 구간에 이름을 붙여줌

예제

환자들의 비만도를 BMI 값에 따라 분류하려고 합니다. 아래 기준에 따라 비만도를 분류해서 obesity라는 컬럼에 저장해 주세요.

  • 18.5 미만(저체중): under
  • 18.5 이상 25 미만(정상): healthy
  • 25 이상 30 미만(과체중): over
  • 30 이상(비만): obese
import pandas as pd
import numpy as np

patient_df = pd.read_csv('data/patient.csv')
patient_df['bmi'] = round(patient_df['weight'] / patient_df['height']**2, 1)

bmi_max = patient_df['bmi'].max() + 1
patient_df['obesity'] = pd.cut(patient_df['bmi'],
                               bins=[0, 18.5, 25, 30, bmi_max],
                               labels=['under', 'healthy', 'over', 'obese'],
                               right=False)
patient_df

df.apply()

patient_df = pd.read_csv('data/patient.csv')
patient_df.head()

def group_age(x):
    if x >= 10 and x < 20:
        return '10s'
    elif x >= 20 and x < 30:
        return '20s'
    elif x >= 30 and x < 40:
        return '30s'
    elif x >= 40 and x < 50:
        return '40s'
    elif x >= 50 and x < 60:
        return '50s'
    else:
        return '60s'

patient_df['age_group'] = patient_df['age'].apply(group_age)

lambda 적용 예시

# def 함수 사용 시, 
def multiply_two(x):
    return 2*x

# lambda 함수로 변경 시, 
lambda x: 2*x

# apply에 lambda함수 적용
patient_df['height'].apply(lambda x: 39.370079*x)

#############################
# eg.  bmi라는 컬럼에 BMI 값을 계산해 두고, BMI 값이 30이 넘으면 비만('Y'), 넘지 않으면 비만이 아니라고('N') 구분

patient_df['bmi'] = round(patient_df['weight'] / patient_df['height']**2, 1)

# 조건식이 참일 때 리턴할 값인 Y, if문을 쓴 다음에는 else 뒤에 조건식이 거짓일 때 리턴할 값 N
patient_df['bmi'].apply(lambda x: 'Y' if x > 30 else 'N')

# eg. BMI 값이 어떤 값들 사이에 있으면 Y를 리턴하고, 그렇지 않으면 N을 리턴하는 함수

# x값이 n_lower와 n_upper 사이에 있을 때 Y를 리턴하고, 그렇지 않으면 N을 리턴
def isin_interval(x, n_lower, n_upper):
    if n_lower <= x < n_upper:
        return 'Y'
    else:
        return 'N'

# lambda 함수 적용
#	isin_interval()를 넣을 때 아래와 같이 세 가지 파라미터를 모두 넘겨줘야 한다. x는 DataFrame에 있는 BMI 값이 되는거고, n_lower와 n_upper는 아래와 같이 18.5와 25를 써 주면 BMI가 18.5 이상 25 미만일 때 Y값이 나온다.
patient_df['bmi'].apply(lambda x: isin_interval(x, 18.5, 25))

# 다른 구간 구하기. 뒤에 들어가는 숫자 값만 변경. 예를 들어 과체중 구간을 구하려면 아래 코드처럼 isin_interval()에 x와 25, 30을 넘겨주면 된다. 
patient_df['bmi'].apply(lambda x: isin_interval(x, 25, 30))