cut()이 데이터 구간화를 위해 만들어진 함수라면, apply()는 원하는 기능을 마음대로 구현할 수 있는 만능 함수
apply()는 다른 함수를 아규먼트로 사용합니다. apply가 '적용하다'라는 뜻을 가지고 있는 것처럼 DataFrame이나 Series에 있는 값 하나하나에 아규먼트로 받은 함수를 적용.
import pandas as pd
df = pd.DataFrame([[1, 9], [4, 16]], columns=['column1', 'column2'])
df

column2에 있는 9와 16의 제곱근 값을 각각 구함.
제곱근을 계산해 주는 numpy의 sqrt()라는 함수를 사용.
아래와 같이 sqrt() 안에 9라는 값을 넘겨주면 9의 제곱근인 3.0을 리턴.
import numpy as np
np.sqrt(9) # 출력 내용 -> 3.0
이제 sqrt()를 apply()와 함께 사용. column2에 있는 값들의 제곱근을 구할 거니까, 아래와 같이 df['column2'].apply()라고 써 준 뒤 괄호 안에는 numpy의 sqrt() 함수를 넣어 주면 됩.
df['column2'].apply(np.sqrt)
여기서 주의할 점은, 함수 안에 함수를 넘겨줄 때에는 함수의 이름까지만 쓰고 뒤에 괄호를 쓰지 않아야 한다는 점인데 np.sqrt라고 써야지 np.sqrt()라고 쓰면 안됨. 위 코드를 실행하면 아래 보이는 것처럼 3과 4, 즉 9와 16의 제곱근 값을 담고 있는 Series가 출력.
0 3.0
1 4.0
Name: column2, dtype: float64
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)

def multiply_two(x):
return 2*x
위 코드를 람다 함수로 변경하면 아래와 같다.
lambda x: 2*x
apply()와 람다 함수를 같이 사용해보면
patient_df['height'].apply(lambda x: 39.370079*x)
표기 단위를 미터에서 인치로 바꾸고 싶다면, 1미터는 약 39.370079인치니까 height 값에 39.370079를 곱한다. 위와 같은 코드를 통해, apply()로 Series에 있는 값들에 하나씩 접근해서 람다 함수를 적용.
위 내용은 간단한 코드라 아래와 같이 해도 됨. 코드도 좀 더 간결하고 실행 속도도 더 빠르기 때문
patient_df['height'] * 39.370079
if문을 함께 사용하면 람다 함수를 좀 더 유용하게 사용할 수 있음. 예를 들어 아래와 같이 bmi라는 컬럼에 BMI 값을 계산해 두고, BMI 값이 30이 넘으면 비만('Y'), 넘지 않으면 비만이 아니라고('N') 구분한다고 하면 콜론 뒤에 바로 조건식이 참일 때 리턴할 값인 Y를 써 주고, if문을 쓴 다음에는 else 뒤에 조건식이 거짓일 때 리턴할 값인 N을 써 주면 됨.
patient_df['bmi'] = round(patient_df['weight'] / patient_df['height']**2, 1)
patient_df['bmi'].apply(lambda x: 'Y' if x > 30 else 'N')
BMI 값이 어떤 값들 사이에 있으면 Y를 리턴하고, 그렇지 않으면 N을 리턴하는 함수를 만들면 그때그때 원하는 값을 함수에 넣어서 쓸 수 있다. 아래 코드를 통해 만든 isin_interval()는 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'
람다함수와 같이 사용.
patient_df['bmi'].apply(lambda x: isin_interval(x, 18.5, 25))
patient_df['bmi'].apply(lambda x: isin_interval(x, 25, 30))