[Pandas] 함수 적용하기(map,apply, applymap)

반응형
    반응형

    판다스 내에서 함수처리 하는 방법입니다.
    파이썬으로 할 수 있지만 판다스 메쏘드로 간단한 함수를 정의할 수 있다는 게 큰 장점이고

    메모리 절약도 할 수 있습니다.

    map, apply, applymap 세가지 메쏘드를 알아볼까 합니다.

     

    map

    map 은 수학시간에 배운 합성함수와 같습니다.
    인덱스가 잘 맞춰져 있다면 값 전환을 할 수가 있습니다.
    x, y를 다음과 같이 정의하겠습니다.

     

    import pandas as pd
    x = pd.Series({'one':1,'two':2,'three':3})
    y = pd.Series({1:'triangle',2:'square',3:'circle'})
    

     

     

    map을 이용해 x에서 y로 값 전환을 합니다.

    x.map(y)

     

    mapd을 반대로 하면 NaN로 나옵니다.

    y.map(x)

     

     

    값이 일부만 있을때는 비어있는 값은 NaN 처리를 하고 map을 진행합니다.

    y = pd.Series({1:'triangle',2:'square'})
    x.map(y)

     

    정리를 하면 그림과 같이 인덱스를 타고 값을 선택하게끔 하는 기능이 map의 기능입니다.

     

    하지만 map은 인덱스에 따라서 값을 전환하는 기능이니DataFrame에서는 사용할 수 없고 Series에서만 할 수 있습니다. DataFrame에서는 map을 하고 싶다면 join과 replace로 대체합니다.

     

    apply

    apply는 Series와 DataFrame에서 lambda 함수를 쓸 수 있는 메쏘드라고 볼 수 있습니다.
    대개는 apply를 안 쓰고 해결할 수 있지만 코드절약과 고급진 방법을 뽐낼때 종종 사용할 수 있습니다.

    아래와 같이 Series에서도 가능합니다.

     

    x.apply(lambda v:v*2)

     

    DataFramep에서도 가능합니다. row, column이 존재하기 때문에 축을 잘 설정해주어야 합니다.
    예를 들어 각 column의 합계를 구하고 싶을때는 axis=0로 하면 되고 row의 합계는 axis=1로 합니다.

    일반적인 (4,3) 행렬을 DataFrame에 옮겨서 apply 합계를 실행해보겠습니다.

     

    import numpy as np
    
    df = pd.DataFrame(np.arange(12).reshape(4,3),columns=['a','b','c'])

     

    #column 합계
    df.apply(lambda x:x.sum())
    

     

    #row 합계
    df.apply(lambda x:x.sum(),axis=1)

     

    column추가할 때도 apply를 활용할 수 있는데 lambda에 적당한 함수를 넣어서 값 계산을 할 수 있습니다.
    아래 예는 a,b column을 row별로 더했습니다.

    df['a+b'] = df.apply(lambda r:r.a+r.b,axis=1)

     

    applymap

    applymap은 apply와 형식은 비슷한데 접근하는 개체가 개별적입니다. 즉, 각 원소에 lambda를 적용하는 경우입니다.
    lambda에서 if 와 같이 조건을 넣을 수 있는데 apply에서는 column이나 row 전체가 움직이게 설계가 된다면
    applymap은 각 원소에 설계가 됩니다.

    df.applymap(lambda x:'%.2f'% x)

     

     

    apply로 같은 요청을 하면 오류가 나옵니다.

    df.apply(lambda x:'%.2f'% x)

     

    if-else를 쓰면 applymap이 무엇인지 좀 더 와닿습니다.

    df.apply(lambda x : '%.2f'% x if (x > 5)  else x)

     

    관련 포스팅
    [Python] Lambda(람다) 함수

    axis(축) 이해

    댓글

    Designed by JB FACTORY

    ....