나홀로 데이터 분석가의 1인 연구실

[Python] 데이터 전처리를 위한 apply(lambda)문 사용하기 본문

Python/Theory

[Python] 데이터 전처리를 위한 apply(lambda)문 사용하기

나홀로 데이터 분석가 2022. 12. 28. 13:41

개인적으로 데이터 전처리를 할 때 핵심이라고 생각하는 apply(lambda)에 대해 알아보겠습니다.

 

우선 데이터프레임(판다스)에서의 apply()와 lambda에 대해서 알아보겠습니다.

 

이하 내용에서 줄임말은 아래와 같이 사용할 예정입니다.

  • df: 데이터프레임
  • func: 함수

 

0-1. Apply() 함수

Apply(func): 'func라는 함수를 모든 값에 적용하라'라는 의미입니다.

 

만약, 데이터프레임['열'].apply(func)를 사용하면, 해당 열에 모든 값에 func를 적용하게 됩니다.

 

💡여기서 함수(func)는 제가 정의해도 되고, 있는 함수를 쓰셔도 무방합니다.

 

<그림1> seaborn의 taxis dataset

 

<그림1>의 데이터 셋에서 passengers 1이면 '나홀로', 2이상이면 '여럿'을 출력하려면 아래와 같이 가능합니다.

# 적용할 함수 정의
def func(x):
    if x == 1:
        return '나홀로'
    elif x>= 2:
        return '여럿'
    else:
        return None
        
# 적용
df['status'] = df.passengers.apply(func)

 

0-2. Lambda 

기본적으로 Lambda한 줄짜리 함수(func)라고 생각하시면 편합니다.

(Lambda x : func)(x): 'x라는 변수에 func라는 함수를 적용하라' 라는 의미입니다.

 

여기서 변수는 꼭 1개일 필요없이 여러개를 사용하셔도 무방합니다.

(lambda x, y : x + y)(3,5)
(lambda x : x.split(' ')[0])('나홀로 데이터 분석가')

func = lambda a, b : a + b
func(1,2)

 

0-3.  Apply() + Lambda

df['columns'].apply(lambda x : func): 'df의 column이라는 행에 func를 모두 적용하라'라는 의미입니다.

 

위 <그림1> 데이터에서 dropoff에서 시간은 제외하고, 날짜만 추출해보겠습니다.

df.dropoff.apply(lambda x : x.split(" ")[0])

apply(lambda x : func)를 사용할 때에는 lambda에 입력값이 df.dropoff의 값이 됩니다.

 

 

여기서 만약 df.dropoff.split(" ")[0]을 입력한다면 에러가 발생합니다.

그 이유는 df.dropoff는 pd.Series이고, Series 자체에 split() 함수를 적용하려고 하기에 에러가 발생합니다.

 

반면 apply(lambda)는 pd.Series의 개별 값 하나하나에 적용되는 것이기에 split()함수가 적용되는 것입니다.

 

<그림2> apply(lambda)의 개념적 이해

 

Comments