[Python.Pandas] Lambda함수와 Map함수 이해하기 - Series.map
2020. 12. 19. 05:00ㆍPython과 머신러닝/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. 관련 포스트
- 2020/12/20 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] Map 함수 실전편 + .replace함수 사용하기
- 2020/12/21 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] DataFrame.apply, DataFrame.applymap
- 2020/12/22 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] Built-in Function 이해하기 - .describe()
'Python과 머신러닝 > Pandas 데이터 분석' 카테고리의 다른 글
[Python.Pandas] DataFrame.apply, DataFrame.applymap (0) | 2020.12.21 |
---|---|
[Python.Pandas] Map 함수 실전편 + .replace함수 사용하기 (0) | 2020.12.20 |
[Python.Pandas] Selection과 Drop (0) | 2020.12.18 |
[Python.Pandas] DataFrame / Series 간 Operation 이해 (0) | 2020.12.17 |
[Python.Pandas] DataFrame Series 추출, loc/iloc 이해하기 (0) | 2020.12.16 |