본문 바로가기
Data Science

apply(lambda if) 함수 데이터프레임 Pandas if else 사용법

by Lora Baek 2022. 9. 29.
300x250

판다스 데이터프레임을 조작할 때, 내가 원하는 함수를 만드는 경우가 있다.

즉, def를 이용해 함수로 나타낸 코드의 return 값을 모든 데이터프레임에 적용할 수 있다는 것인데,

이럴 때 이용하는 것이 apply 함수이다.

리스트에서 map 함수가 있다면, 데이터프레임에는 apply 함수가 있다. map과 apply도 아래에서 간단히 살펴보자.

 

전체 데이터프레임이나 특정 칼럼 값을 일괄적으로 가공하는 게 더 빠르겠지만,

특정 조건을 걸어서 조금 더 복잡하게 데이터를 가공해야 할 때 lambda식과 결합하여

apply lambda를 이용하는 것이 좋다.

 

파이썬 Python list apply lambda x y 함수

먼저 lambda(람다) 함수에 대해서 먼저 알아보자.

lambda 함수는 함수명을 프로그래밍할 때, 사용자 정의 함수를 문법에 맞춰 작성하는 것보다 간단하게 해결할 수 있도록 한다.

예를 들어 a와 b의 값을 더하는 get_sum(a,b)라는 함수를 만들고, 결과를 출력하기 위해서는 아래와 같이 식을 작성해야 할 것이다. 함수명과 입력인자 부분, 가공하고 return 하는 부분이 필요하다.

 

def get_sum(a,b):
    return a+b

print(get_sum(10,20))

만약 위 식을 lambda 식으로 바꾼다면 한 줄로 작성이 가능하다.

get_sum_lambda = lambda x,y : x+y
print(get_sum_lambda(10,20))

:를 기준으로 왼쪽에는 입력인자들을, 오른쪽에는 계산식(반환되는 return값)을 입력해주면 된다.

 

만약 여러 개의 입력인자들이 리스트 형태로 있을 경우, map을 이용해 한 번에 처리할 수 있다.

lambda 매개변수 1, 매개변수 2 : 공식, 매개변수 1, 매개변수 2와 같이 적어주면 된다.

a = [10,20,30]
b = [4,5,6]
sums = map(lambda x,y : x+y, a,b)
list(sums)

 

결괏값으로 [14,25,36]을 얻을 수 있다.

 

 

판다스 데이터프레임 Pandas apply (lambda) 활용

데이터프레임의 apply(lambda) 식은 똑같은 원리로 작동한다.

함수를 먼저 만든 다음 .apply(lambda x: 함수(변수))와 같은 식으로 적용할수 있을 것이다.

 

이렇게 lambda를 사용할 때, if나 else if, else는 이용이 불가능하지만

유일하게 이용할 수 있는 것이 if else문이며,한 가지만 유의해서 사용하면 된다.

 

바로 반환값1 if 조건식 else 반환값2 와 같은 형태로 작성해야 한다는 점이다.

나이를 예로 들자면, 18세 이하면 Child, 아니면 Adult로 값을 할당하기 위한 람다식의 작성은 아래와 같다.

lambda x : 'Child' if x<=18 else 'Adult'

 

Pandas lambda if else

이를 데이터프레임의 칼럼에 apply로 일괄 적용하고자 한다면, 코드는 이런 형태가 될 것이다.

데이터프레임명.apply(lambda x : x['칼럼명'] 반환값

                                                     if x['칼럼명'] 조건식

                                                    else x['칼럼명'] 반환값),

                                                   axis=1)

 

titanic 데이터의 Age 값을 4세 이하는 Baby, 5세~18세 이하는 Child, 나머지는 Adult로 분류하기 위해서는

아래의 두 방법을 이용할 수 있다. 앞으로 만나게 되는 데이터에 따라서 적절한 방법을 선택하여 코드를 작성하자!

#1. 바로 lambda식 이용하기. 간단하고 빠르지만, 조건을 많이 걸어야 하는 상황에는 부적합하다.

df['Age_cat1']=df['Age'].apply(lambda x:'Baby' 
                               if x<=4
                               else ('Child'
                                     if x<=18
                                     else 'Adult'))
print(df['Age_cat1'].value_counts())
df[['Age','Age_cat1']].head()

 

 

#2. 함수 만들어서 lambda식 적용하기. 세분화된 분류가 필요한 경우 적절하다.
def Age_cat2(age):
    cat2=''
    if age<=4 : cat2= 'Baby'
    elif age<=18 : cat2= 'Child'
    else : cat2 = 'Adult'
    
    return cat2


df['Age_cat2']=df['Age'].apply(lambda x : Age_cat2(x))
print(df['Age_cat2'].value_counts())
df[['Age','Age_cat2']].head()

위의 두 코드가 아래와 같이 똑같은 결과를 반환한다는 것을 확인할 수 있다.

댓글