본문 바로가기
판다스/중급 판다스

[pandas] 시리즈에 apply 대신 map 함수로 매핑하는 이유

by 김판다t 2023. 5. 27.

시리즈에 apply 대신 map 함수로 매핑하는 이유

apply 함수와 map 함수의 가장 큰 차이는 데이터 프레임에 적용할 수 있는지 여부입니다. apply 함수는 데이터 프레임과 시리즈 모두에 사용할 수 있는 반면, map 함수는 시리즈에만 사용할 수 있습니다. (map 함수는 인덱스 클래스에는 적용 가능합니다.)

 

시리즈에 매핑을 수행할 때는 apply와 map 함수를 모두 사용할 수 있지만, 일반적으로 map 함수를 더 자주 사용합니다.

 

그렇다면 왜 범용성이 높은 apply를 두고 굳이 map 함수로 매핑을 하는 것일까요?

 

 

결론부터 말하자면 apply 함수는 함수로만 매핑이 가능하지만, map 함수는 apply와는 달리 함수뿐만 아니라 매퍼(mapper), 즉 딕셔너리와 같은 구조체도 사용할 수 있다는 차이가 있습니다. 예시를 통해 이를 알아보겠습니다.

 

Example Code

 

import pandas as pd
# 예시 시리즈 s 생성
s = pd.Series(list('babba'))
0    b
1    a
2    b
3    b
4    a
dtype: object

 

 

이제 시리즈 s에서 a를 0으로, b를 1로 매핑하는 작업을 수행해 보겠습니다.

1. apply 함수로 lambda 함수를 이용해 매핑한 경우

# apply함수로 lambda 함수를 이용해 매핑한 경우
m = {'a':0, 'b':1}
s.apply(lambda x: m[x])

 

2. map 함수로 lambda 함수를 이용해 매핑한 경우

# map 함수로 lambda 함수를 이용해 매핑한 경우
m = {'a':0, 'b':1}
s.map(lambda x: m[x])

 

위 두 방식은 동일한 결과를 반환합니다. 

 

output:

0    1
1    0
2    1
3    1
4    0
dtype: int64

 

 

결과적으로 map 함수와 apply 함수로 lambda 함수를 이용해 매핑하는 경우는 함수만 다를 뿐 코드가 유사합니다. 굳이 범용성이 뛰어난 apply를 두고 map 함수를 사용할 이유가 없어 보입니다.

 

3. map 함수로 딕셔너리로 매핑한 경우

# map함수로 딕셔너리(매퍼)로 매핑한 경우
m = {'a':0, 'b':1}
s.map(m)

 

map 함수는 함수뿐만 아니라 딕셔너리를 이용해 매핑할 수 있으며, 이는 lambda 함수를 이용한 매핑보다 더 간결하고 속도도 빠릅니다. 그래서 시리즈에서는 map 함수를 주로 매핑에 사용합니다.

 

속도

 

속도 차이를 확인하기 위해, 다음의 세 가지 함수를 생성했습니다.

m = {'a':0, 'b':1}

def map_dict(x):
    return x.map(m)

def map_func(x):
    return x.map(lambda x: m[x])

def apply_func(x):
    return x.apply(lambda x: m[x])

 

map_dict 함수는 map 함수를 사용해 딕셔너리를 매핑한 것입니다.
map_func 함수는 map 함수를 사용해 lambda 함수로 매핑한 것입니다.
apply_func 함수는 apply 함수를 사용해 lambda 함수로 매핑한 것입니다.

 

세 기법으로 행의 길이를 달리하며 속도를 측정하면 결과는 다음과 같습니다.

 

 

y축이 시간 값을 나타내므로, y값이 낮을수록 빠른 속도를 의미합니다. apply 함수와 map 함수 모두 lambda 함수를 이용한 경우 속도 차이가 거의 없으나, 딕셔너리를 매핑한 map 함수는 시리즈의 길이가 충분히 길어질 때 약 10배 정도 빠른 속도를 보입니다.

 

결론적으로, map 함수를 이용해 딕셔너리(혹은 시리즈)를 매핑하면 코드가 간편할 뿐만 아니라 속도 또한 빨라지기 때문에 사용됩니다. 다만 적용하는 시리즈의 길이가 짧을 경우 굳이 apply를 대신해 map을 사용할 필요는 없습니다. 초보자의 경우 대규모 데이터를 다루는 일이 적으므로, 속도의 차이가 크게 느껴지지 않을 수 있습니다.

 

초심자가 map 함수를 배워야 하는 또 다른 이유

 

초심자들이 apply 함수가 있음에도 map 함수를 배워야 하는 또 다른 이유는 판다스 숙련자들의 코드에 map 함수가 많이 사용되기 때문입니다. map 함수는 딕셔너리를 매퍼로 적용할 수 있어 간편하며, 특히 apply 함수와 달리 인덱스에도 적용할 수 있는 추가적인 장점이 있습니다. 이러한 이유로 숙련자들은 시리즈에 매핑할 때 apply 함수보다 map 함수를 선호합니다. 따라서 초심자도 다른 사람의 코드를 읽고 이해하기 위해서는 map 함수를 알고 있는 것이 필요합니다.

 

map 함수와 apply 함수의 차이를 정리하면 다음과 같습니다.

분류 map apply
적용 대상 시리즈, 인덱스 클래스 시리즈, 데이터 프레임
인수 함수, 딕셔너리 등의 매퍼 함수
인수로 입력된 함수의 적용 방법 셀마다 함수 적용 시리즈에 적용할 때는
셀마다 함수 적용 / 
데이터 프레임에 적용할 때는 
시리즈마다 함수 적용

판다스 책이 출판되었습니다.

 

교보문고 구매 페이지, 알라딘 구매 페이지yes24 구매 페이지