본문 바로가기

Growth Hacking/Python

판다스(Pandas)에서 map과 apply의 차이점

파이썬(Python)을 데이터 분석 도구로 사용할 경우, 가장 자주 살펴보게 될 라이브러리는 단언컨대 판다스(Pandas)입니다. 그래서 간략하게 판다스(Pandas)에 대해 알아보고, 판다스(Pandas)에서의 map과 apply의 차이점에 대해 정리해보고자 합니다.

  • 판다스(Pandas)란 무엇이죠?

 판다스(Pandas)는 파이썬(Python)에서 구조화된 데이터나 표 형식의 데이터를 빠르고 쉽게 표현적으로 다룰 수 있도록 설계된 라이브러리입니다. 기존에 R언어를 사용해보신 경험이 있으신 분들은 DataFrame이라는 데이터 구조가 낯설지 않으실텐데요. 파이썬(Python)에서는 DataFrame과 같은 데이터 구조를 내장함수에서 지원하지 않기때문에 외부모듈인 판다스(Pandas)를 사용하셔야 합니다. 기존에 R언어를 사용해보지 않으신 분들은 엑셀의 표 형식과 같은 데이터 구조라고 생각해주시면 됩니다.(판다스 설치방법)

 판다스(Pandas)는 금융 분석가로 근무하던 웨스 맥키니(Wds McKinney)라는 사람이 복잡하고 느린 데이터 분석 툴에 실망하여 만들게 된 라이브러리며, 넘파이(Numpy)의 고성능, 배열 연산 아이디어관계형 데이터베이스(SQL)의 유연한 데이터 처리 기능을 결합한 것이라 할 수 있습니다. 정확히 구분은 못하겠지만 저도 어느 상황에서는 SQL보다 판다스(Pandas)를 찾게 되는 순간이 있더라구요.

 판다스(Pandas)는 넘파이(Numpy)의 스타일을 많이 차용했지만 가장 큰 차이점은 표 형식의 데이터나 다양한 형태의 데이터를 다루는데 초점을 맞춰 설계했기 때문에 조금 더 편하게 사용하실 수 있습니다. 넘파이(Numpy)는 단일 산술배열 데이터를 다루는데 조금 더 초점이 맞춰져 있는것 같구요.

source: excel

판다스(Pandas)는 크게 2가지의 자료구조로 나뉘어집니다. SeriesDataFrame인데요. Series는 1차원 배열 구조의 자료구조를 의미하며, DataFrame은 2차원 이상의 배열 구조의 자료 구조를 의미합니다. Series는 단일 컬럼을 가진 데이터의 모음, DataFrame은 2개 이상의 컬럼을 가진 데이터의 모음이라 생각하면 쉽게 이해하실 수 있으실 것 같네요. 예시로 Series와 DataFrame을 생성해보도록 하겠습니다. 예시를 확인해보시면 Series와 Pandas의 차이점은 쉽게 아실 수 있을것입니다 :)

# Series 생성

import pandas as pd
import numpy as np

SR = pd.Series(range(33,54,5), name="Score")
SR

# 결과
0    33
1    38
2    43
3    48
4    53
Name: Score, dtype: int64

 

# DataFrame 생성

import pandas as pd
import numpy as np

DF = pd.DataFrame({"No": [1,3,5,7,9], "Class": ["A","B","B","A","B"], "Score": range(33,54,5)})
DF

# 결과
   No Class  Score
0   1     A     33
1   3     B     38
2   5     B     43
3   7     A     48
4   9     B     53

그렇다면 오늘의 본론이 map 함수와 apply 함수에는 어떤 차이가 있을까요? 단일 컬럼에서는 map함수, apply함수 모두 사용하실 수 있지만, 다중 컬럼이 기준이 되는 경우에는 map 함수를 사용하실 수 없습니다. 위의 예시에 적용하여 살펴보도록 하겠습니다.

# Series에 map함수, apply함수 적용

import pandas as pd
import numpy as np

SR = pd.Series(range(33,54,5), name="Score")
mapSR = SR.map(lambda x: x*2)
mapAP = SR.apply(lambda x: x*2)

mapSR
mapAP

# 결과
0     66
1     76
2     86
3     96
4    106
Name: Score, dtype: int64

Series 또는 DataFrame의 단일 컬럼에서는 정상적으로 작동합니다. 하지만 apply 함수에서는 다른 결과를 출력합니다.

# 다중 컬럼에 map 함수를 적용했을 경우

import pandas as pd
import numpy as np

DF = pd.DataFrame({"No": [1,3,5,7,9], "Class": ["A","B","B","A","B"], "Score": range(33,54,5)})
mapDF = DF.map(lambda x: x.Score * 2)
mapDF

# 결과
Traceback
mapDF = DF.map(lambda x: x.Score * 
2)
  File "\lib\site-packages\pandas\core\generic.py", line 5139, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'map'

map 함수는 작동하지 않습니다. 그래서 다중 컬럼에서는 apply 함수를 사용하셔야 하는데요.

# 다중 컬럼에 apply 함수를 적용했을 경우

import pandas as pd
import numpy as np

DF = pd.DataFrame({"No": [1,3,5,7,9], "Class": ["A","B","B","A","B"], "Score": range(33,54,5)})
mapAP = DF.assign(X2 = DF.apply(lambda x: x.Score*2, axis=1))\
    .drop("Score", axis=1)\
    .rename(columns={"X2":"Score"})
mapAP

# 결과
   No Class  Score
0   1     A     66
1   3     B     76
2   5     B     86
3   7     A     96
4   9     B    106

다소 길어지긴 했지만, axis = 1 파라미터를 넣어주면 다중컬럼일 때에도 잘 작동하게 됩니다.

판다스(Pandas)의 전반적인 내용과 간단하지만 생각보다 자주 걸리는 map 함수와 apply 함수의 차이점에 대해 알아보았습니다. 보다 효율적인 코드가 있다면 댓글로 공유해주세요!

'Growth Hacking > Python' 카테고리의 다른 글

파이썬이 C++보다 빠를 수 있다(번역글)  (0) 2021.02.08