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))