본문 바로가기
Python/Pandas

데이터 프레임에 함수 적용: map, apply, applymap 완벽 정리

by 모두의 케빈 2022. 11. 24.

안녕하세요. 모두의 케빈입니다.

오늘은 map, apply, applymap의 정의와 각각의 차이점을 완벽하게 예제를 활용하여 설명해드리도록 하겠습니다.

 

■ 메서드 설명

 

[요약] map, apply 메서드의 차이는 거의 없고, apply를 주로 활용한다. 다만, map이 유용하게 쓰이는 경우가 있다.

먼저 mapapply 메서드입니다. map은 Series에만 적용 가능하며, apply는 Series 또는 데이터 프레임의 행, 열에 적용 가능합니다. pandas 환경에서 대부분 apply 메서드를 활용하시는 게 편합니다. 단, map 메서드는 key 값으로 Series를 바로 mapping 할 때 굉장히 편하게 사용할 수 있습니다.

 

[요약] apply와 applymap의 차이는 데이터 프레임 개별 값에 함수를 적용하는지, 행 또는 열 전체에 적용하는지 차이

다음은 applymap입니다. applymap은 데이터 프레임 전체에 사용하며 함수를 데이터 프레임 개별 값에 모두 적용합니다. apply와 applymap의 차이는 함수를 개별 값에 적용하는지, Series 또는 행, 열에 적용하는지의 차이입니다. 감이 잘 안 오실 텐데, 예제를 통해 설명드리겠습니다. 

 

[Tip] 참고로 map은 pandas 메서드가 아닌 함수로도 활용됩니다. map 함수는 pandas 환경 이외 python native 즉, list나 dict 같은 반복적 자료형에도 적용 가능합니다.

# 참고: map 함수 사용법

a = [1.2, 2.5, 3.7, 4.6]

# 모든 element를 정수화
a = list(map(int, a))

 

 

■ 예제: 파이썬 코드

 

map과 apply 비교 실습

 

먼저 map에 대해 실습해보도록 하겠습니다. 

# 데이터 프레임 선언
df = pd.DataFrame({"급여":[200,300,400,500], "상여":[100,200,300,400]})

# 사용자 설정 함수
def summation(x):
    return x+100

# 데이터 프레임의 하나의 열에 map 적용
df["급여"].map(summation)

아래는 위 코드의 결과 값입니다.

# 위 코드의 결과값 #
# ================ #
0    300
1    400
2    500
3    600
Name: 급여, dtype: int64

 

 

위 코드와 동일하게 apply도 활용해보겠습니다.

# 데이터 프레임 선언
df = pd.DataFrame({"급여":[200,300,400,500], "상여":[100,200,300,400]})

# 사용자 설정 함수
def summation(x):
    return x+100

# 데이터 프레임의 하나의 열에 map 적용
df["급여"].apply(summation)

아래는 위 코드의 결과 값입니다.

# 위 코드의 결과값 #
# ================ #
0    300
1    400
2    500
3    600
Name: 급여, dtype: int64

뭔가 느껴지시나요? map과 apply의 결과가 동일합니다. 사실 두 메서드는 기능이 거의 유사합니다. 하지만 완전히 동일한 기능을 하면 map 메서드가 따로 존재할 필요가 없겠죠? map은 key 값으로 Series를 mapping 할 때 유용합니다.

 

map이 유용한 경우: key 값을 활용한 Series 간 mapping

series1 = pd.Series(index = ["철수","영호","민수"], data = ["빨간공", "파란공","노란공"])
series2 = pd.Series(index = ["빨간공", "파란공","노란공"], data = ["2만원", "3만원", "4만원"])

# 철수 - 빨간공, 빨간공은 2만원과 같은 방식으로 mapping 진행
series1.map(series2)

아래는 위 코드의 결과 값입니다.

# 결과 값 #
# ======== #
철수    2만원
영호    3만원
민수    4만원
dtype: object

신기하지 않나요? series 1의 data를 series 2의 key 값과 mapping 하여 마치 엑셀의 VLOOKUP처럼 값을 불러왔습니다. apply도 물론 이런 기능을 할 수 있지만, map만큼 편하지는 않습니다. 

정리해서 말씀드리면 map은 Series에만 적용 가능하므로, 데이터 프레임에서 함수를 적용할 땐 여러 열, 행에 적용 가능한 apply를 사용하는 것을 권장합니다. 단, key 값을 활용하여 두 Series를 mapping 할 땐 map 메서드를 사용하는 것을 추천합니다.

 

 

다음으로 applymap에 대해 실습해보도록 하겠습니다.  

def summation(x):
    return x+100


df = pd.DataFrame({"급여":[200,300,400,500], "상여":[100,200,300,400], "특보":[100,200,300,400]})

df.applymap(summation)

아래는 위 코드의 결과 값입니다.

# 결과 값: 모든 Cell에 100이 더해진 것을 확인 할 수 있다.
# ==================================================== #
       급여	상여	특보
0	300	200	200
1	400	300	300
2	500	400	400
3	600	500	500

 

자 그런데, 이 코드를 apply로 해보면 어떻게 될까요?

def summation(x):
    return x+100

df = pd.DataFrame({"급여":[200,300,400,500], "상여":[100,200,300,400], "특보":[100,200,300,400]})

df.apply(summation)

apply와 applymap의 결과 값이 동일한 것을 알 수 있습니다. 왜 그럴까요?

      급여	상여	특보
0	300	200	200
1	400	300	300
2	500	400	400
3	600	500	500

 

applymap은 데이터 프레임 전체에 적용하며, 개별 값에 함수를 적용합니다. 따라서 개별 값에 모두 100을 더한 결과가 출력됩니다. 반면, apply는 데이터 프레임의 하나 또는 여러 행, 열에 함수를 적용합니다. 

여기서 Series에 단순 연산 함수가 적용되면, 어차피 개별 값에 자동 적용이 되기 때문에 apply와 applymap의 결과 값이 동일할 수밖에 없습니다. 둘의 차이를 알기 위해서는 슬라이싱을 해보면 됩니다.

 

apply와 applymap의 차이를 쉽게 이해할 수 있는 예제

 

모든 값에서 '원'을 빼고 앞의 숫자만 남겨보도록 하겠습니다. applymap을 활용하면 쉽게 가능합니다.

def summation(x):
    return x+100

df = pd.DataFrame({"급여":["200원","300원","400원","500원"], 
                   "상여":["100원","200원","300원","400원"],
                   "특보":["100원","200원","300원","400원"]})

# '원'을 제외하고 앞의 숫자만 슬라이싱 해보기

df.applymap(lambda x : x[:3])

applymap을 사용한 결과 값입니다. 

# 아래는 결과 값
# ============== #
      급여	상여	특보
0	200	100	100
1	300	200	200
2	400	300	300
3	500	400	400

 

위와 동일한 함수를 apply로 적용해보겠습니다.

def summation(x):
    return x+100

df = pd.DataFrame({"급여":["200원","300원","400원","500원"], 
                   "상여":["100원","200원","300원","400원"],
                   "특보":["100원","200원","300원","400원"]})

# '원'을 제외하고 앞의 숫자만 슬라이싱 해보기

df.apply(lambda x : x[:3])

동일한 함수를 apply로 적용했을 때, 차이점이 보이시나요?

# 아래는 결과 값 #
# ============= #
      급여	상여	특보
0	200원	100원	100원
1	300원	200원	200원
2	400원	300원	300원

 

놀랍게도, 같은 함수를 적용했지만 '원'이 아니라 '마지막 행'이 제거되었습니다. apply는 Series에 적용된다고 말씀드렸습니다. '급여' 열이 [200원, 300원, 400원, 500원]이 있을 때 3번째 element까지 슬라이싱 하는 함수를 적용하면 마지막 element인 '500원'이 없어지는 것입니다. 반면 applymap은 개별 값에 적용되기 때문에 '200원'에서 3번째 element까지인 '200'까지만 슬라이싱 됩니다.

 

 

오늘은 map, apply, applymap에 대해 완벽하게 정리해봤습니다. 궁금하신 점이 있다면 댓글 남겨주세요. :)

댓글