본문 바로가기
파이썬 (투자분석용)/Pandas 및 python 일반

판다스 데이터프레임과 Lambda 함수의 이해와 사용법

by amAToRoi 2022. 2. 4.
반응형

람다(lambda) 함수의 활용은 많은 python 개발자나 pandas 이용자들이 입을 모아 하는 말이다. 손 쉽게 적용할 수 있다고 한다. 나같은 초심자의 입장에서는 도무지 알 수가 없다. 아니, 이해는 되는데 쓸 수가 없었다.

그리고, 끝내, 원인을 찾았다.
동작절차를 모르기 때문….. 너무 당연한가?
아니, 더 정확히 말하면 DataFrame에서 x가 뭔지 몰라서 그랬다.

  결론은 단순하다. df.apply( lambda x : print(x) )로 x가 무엇인지는 알고 사용하자.

  lambda 함수의 구조는 lambda 매개변수: 표현식 으로 이루어진다.

  사실상 inline 함수선언이다.

DataFrame이나 Series에서 lambda 함수를 쓰는데 매개변수 x가 무엇일까?
DataFrame 에서는 column 이고, Series에서는 value 다.

백문이 불여일견.

print()로 x를 알아보자

  1. 간단한 DataFrame 정의
>>> import pandas as pd
>>> df = pd.DataFrame([[1,2,3],[-11,-22,-33]])

    0   1   2
0   1   2   3
1 -11 -22 -33

2개의 행과 3개의 열을 가진 행열 모양으로 정의했다.

  1. print(x) 집어넣기
>>> df.apply( lambda x : print(x, '\n --- 구분 ---\n') )

0     1
1   -11
Name: 0, dtype: int64
 --- 구분 ---

0     2
1   -22
Name: 1, dtype: int64
 --- 구분 ---

0     3
1   -33
Name: 2, dtype: int64
 --- 구분 ---
# 마지막 '구분' 뒤에는 apply함수가 적용된 결과이므로 무시하자.

출력을 봐서 알겠지만, int64 타입으로, 컬럼명(0,1,2)이 name으로 정의된 각각의 컬럼이 1번씩 총 3번 호출된 것을 알 수 있다. 3개의 컬럼으로 이루어진 데이터프레임이므로.

달리말해, 데이터프레임 df에 apply 함수를 이용해서 lambda 함수를 실행하면
내부적으로 첫번째 컬럼을 Series로 변환하여 x에 할당하고 표현식(print(x, '\n --- 구분 ---\n'))에 따라 반환하고,
두번째 컬럼과 세번째 컬럼을 동일한 방법으로 반복(for loop)한 것.

  1. 심심해서 확인해보는 Series에서의 x
# 첫번째 컬럼음 1과 -11인 2개의 값으로 구성된 Series
>>> df[0]
0     1
1   -11
Name: 0, dtype: int64

>>> df[0].apply( lambda x : print(x, '\n --- 구분 ---\n') )
1
 --- 구분 ---

-11
 --- 구분 ---

x 는 2번(df[0]이 갖는 인자의 개수)의 loop를 돌며, 첫번째는 1이 두번째는 -11이 할당됨을 알 수 있다.

lambda 표현식 활용법

print(x)가 원래 하고 싶었던 말이지만, 혹시나 표현식이 궁금할까봐 데이터프레임에서 한번, 시리즈에서 한번 실행결과를 샘플로 남겨둔다.

Series

# 표현식이 매개변수에 다시 할당되는 방식임으로, x 제곱을 할당해보자.
>>> df[1]  
0     2
1   -22
Name: 1, dtype: int64

>>> df[1].apply( lambda x : x ** 2 )  
0      4
1    484
Name: 1, dtype: int64

DataFrame

Series가 x에 할당됨으로 Series 내장함수, 배열함수 또는 for loop을 써야 한다.
lambda 함수는 inline이니까, for loop 도 inline으로 쓰자.

>>> df

    0   1   2
0   1   2   3
1 -11 -22  33

>>> df.apply( lambda x : [i ** 2 for i in x] )
     0    1     2
0    1    4     9
1  121  484  1089
>>>

몇번이나 다시말하는 결론

다시한번 결론을 말하자면,

  lambda 함수의 표현식에 print(x)를 써서 x가 뭔지 알면 lambda 함수의 이해가 빠르다는 것

반응형

댓글