[Python.Pandas] Lambda함수와 Map함수 이해하기 - Series.map

2020. 12. 19. 05:00Python과 머신러닝/Pandas 데이터 분석

1. Lambda란?

In [1]:def f1(x,y): 
           return x+y
In [2]:f1(1,2)
Out[2]:3

In [3]:f2=lambda x,y:x+y

In [4]:f2(1,2)
Out[4]:3
  • Lambda함수를 한 줄로 표현하는 익명 함수 기법이다.
  • lisp 언어에서 시작된 기법으로 오늘날 현대 언어에서도 많이 사용된다.
  • 위의 예시에서 보면 f1과 f2는 동일한 동작을 하도록 정의된 함수들이다 (두 개의 Parameter에 대한 add함수)
  • 정의 방식이 다르지만, lambda는 한 줄로 함수를 정의할 수 있다는 점만 다르고, 동작은 동일하다는 것을 확인할 수 있다.

 

2. Map 함수

In [5]:f3 = lambda x:x**2

In [6]:data = [1,2,3,4,5]

In [7]:list(map(f3,data))
Out[7]:[1, 4, 9, 16, 25]

In [8]:f4 = lambda x,y:x+y

In [9]:list(map(f4,data,data))
Out[9]:[2, 4, 6, 8, 10]

In [10]:list(map(lambda x:x+5, data))
Out[10]:[6, 7, 8, 9, 10]
  • Map 함수란 함수와 Sequence형 데이터를 Parameter로 입력받아, 각 element 마다 함수를 적용하여 List로 반환하는 함수이다. 
  • 여기서 함수를 전달할 때, 주로 lambda 형태로 전달하게 되어, Lambda와 Map함수를 같이 공부한다.
  • f3은 parameter를 제곱하는 lambda 함수이다.
  • Map 함수를 통해 f3와 data를 전달하면, 기존의 1,2,3,4,5의 값이 제곱이 된 것을 확인할 수 있다 (Out[7]).
  • f4는 두 개의 Parameter를 더해주는 함수이다.
  • 그렇기 때문에 In[9]와 같이 f4를 전달하면 data를 2개 전달해야 하고, 이에 대한 결과로 각 값이 더해져서 두 배가 된 것을 확인할 수 있다.
  • 마지막으로 In[10]에서는 lambda 함수를 따로 정의하지 않고 바로 map 함수의 인자로 전달할 수도 있다는 것을 보여주는 예시이다. 
  • 각 값에 5가 더해져서 list의 형태로 반환되었다.

 

3. Map 함수를 Series에 적용하기

In [11]:from pandas import Series, DataFrame 
        import pandas as pd 
        import numpy as np
In [12]:s1 = Series(np.arange(10)) 
        s1
Out[12]:0 0 
        1 1 
        2 2 
        3 3 
        4 4 
        5 5 
        6 6 
        7 7 
        8 8 
        9 9 
        dtype: int32
        
In [13]:def f(x): 
            return x+5
In [14]:s1.map(f)
Out[14]:0 5 
        1 6 
        2 7 
        3 8 
        4 9 
        5 10 
        6 11 
        7 12 
        8 13 
        9 14 
        dtype: int64
  • 그렇다면 Map 함수는 언제 쓰이고 왜 중요할까?
  • Series 데이터를 한 번에 변형하고 싶을 때, 원하는 규칙을 함수로 정의하여 map의 parameter로 전달한다.
  • 이때 규칙을 정의한 함수를 Lambda 함수로 정의하면 더 수월한 경우가 있기 때문에
    Series 변형 -> Map 함수 -> Lambda 함수 순으로 사용하게 된다.
  • 위의 예시를 보면 s1은 index : 0~9, value : 0~9를 가진 Series 객체이다.
  • 이 s1 Series object에. map(f)를 전달하면, 각 index 별로 value가 5씩 증가한 것을 확인할 수 있다.
  • 이와 같이 원하는 규칙을 정의한다면, Series의 각 값들을 한 번에 변형할 수 있다는 장점이 있다.

 

4. Dict Type을 사용한 데이터 변환 (Encoding)

In [15]:z = {1:'A', 2:'B', 3:'C'}

In [16]:s1.map(z)
Out[16]:0 NaN 
        1 A 
        2 B 
        3 C 
        4 NaN 
        5 NaN 
        6 NaN 
        7 NaN 
        8 NaN 
        9 NaN 
        dtype: object
  • 예를 들어 s1이라는 Series의 값 중 1이라는 숫자는 사실 A라는 값이고, 2는 B, 3은 C라고 가정하자.
  • 이러한 것이 Encoding의 가장 단순한 예시이다. (사람이 이해하기 의미를 컴퓨터가 이해하기 쉬운 숫자로 변환하는 것, 그리고 그걸 다시 사람이 이해하기 쉬운 의미의 용어로 변형하는 것을 Encoding/Decoding이라고 한다.)
  • 그래서 1/2/3의 값을 각각 A, B, C로 변형하고 싶다면, z라는 dict type의 변수를 In[15]와 같이 정의한다.
  • 그리고 s1에 map의 parameter로 함수가 아닌 dict type 변수를 전달하면, Series의 각 value를 dict의 key와 비교하여 동일하면, Series의 value를 dict의 value로 대체한다.
  • 그래서 Out[16]의 결과에 0, 4~9의 값을 가졌던 곳은 dict에 정의되어 있지 않아 NaN 값으로 표기되고, 1/2/3에 해당했던 value들이 A, B, C로 치환된 것을 볼 수 있다. 
  • 즉, 한 column/series의 값을 원하는 규칙대로 encoding/decoding 하고 싶을 때 dict type으로 정리한 뒤, map 함수를 사용하여 한 번에 변형할 수 있다.

 

5. Series로 Series 값 변환 (Encoding)

In [17]:s2 = Series(np.arange(10,30)) 
        s2
Out[17]:0 10 
        1 11 
        2 12 
        3 13 
        4 14 
        5 15 
        6 16 
        7 17 
        8 18 
        9 19 
        10 20 
        11 21 
        12 22 
        13 23 
        14 24 
        15 25 
        16 26 
        17 27 
        18 28 
        19 29 
        dtype: int32
        
In [18]:s1.map(s2)
Out[18]:0 10 
        1 11 
        2 12 
        3 13 
        4 14 
        5 15 
        6 16 
        7 17 
        8 18 
        9 19 
        dtype: int32
  • Map parameter로 Series를 전달하면 어떻게 동작할까?
  • s1.map(s2)를 할 경우, s1의 index를 하나씩 잡아서 s2에 index가 존재하는지 확인하고, 만약 존재한다면 s2에 동일 index의 value를 읽어서 s1의 value로 치환해준다.
  • 만약 s1의 index와 동일한 index가 s2에 존재하지 않는다면, s1의 값을 NaN으로 치환한다.
  • 그렇게 s1의 모든 index를 s2의 index와 비교하여 값을 치환해주고 나면 map 동작이 끝난다.
  • 그렇기 때문에 원래는 0~9의 value가 있었던 것들이, s2의 ndex 값과 동일하게 변경되어 10~19로 변형된 것을 확인할 수 있다.

 

6. 관련 포스트

 

[Python.Pandas] Map 함수 실전편 + .replace함수 사용하기

1. wget으로 데이터 다운로드하여 .unique로 데이터 종류 분석하기 In [1]:import wget url = 'https://raw.githubusercontent.com/rstudio/Intro/master/data/wages.csv' wget.download(url) Out[1]:'wages.csv'..

coding-grandpa.tistory.com

 

[Python.Pandas] DataFrame.apply, DataFrame.applymap

1. DataFrame.Apply - 하나의 Series가 아닌 전체 DataFrame에 함수를 적용하고 싶을 때 In [1]:from pandas import Series, DataFrame import pandas as pd import numpy as np In [2]:df = pd.read_csv("wages.c..

coding-grandpa.tistory.com

 

[Python.Pandas] Built-in Function 이해하기 - .describe()

1. DataFrame.describe 및 데이터 초기 분석 In [1]:from pandas import Series, DataFrame import pandas as pd import numpy as np In [2]:df = pd.read_csv('wages.csv') df.head(2).T Out[2]: 0 1 earn 79571...

coding-grandpa.tistory.com