람다(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를 알아보자
- 간단한 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개의 열을 가진 행열 모양으로 정의했다.
- 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)한 것.
- 심심해서 확인해보는 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 함수의 이해가 빠르다는 것
'파이썬 (투자분석용) > Pandas 및 python 일반' 카테고리의 다른 글
[python] 네이버금융 주요 재무정보 스크래핑 (0) | 2022.02.26 |
---|---|
[python] Pandas, 데이터프레임 비교하기(pandas.DataFrame.compare()) (0) | 2022.02.10 |
[Pandas] rolling과 ewm으로 이동평균 구하기 (0) | 2022.02.08 |
[python] 한국증시(코스피, 코스닥) 주가정보 추출 feat. by 네이버금융 (0) | 2022.02.01 |
[python] 한국증시(코스피, 코스닥) 종목코드 받아오기 (0) | 2022.01.29 |
댓글