본문 바로가기
Python/Pandas

다중(여러개) 함수 적용 transform() 메서드-pandas(34)

by 콩돌 2020. 10. 9.
반응형

파이썬 버전 3.8 기준

pandas 버전 1.1.1 기준


 다중(여러개) 함수 적용 transform() 메서드


pandas의 객체에 다른 라이브러리의 함수를 적용하는 방법이 존재한다.

아래의 메서드는 다른 라이브러리의 함수를 적용하는데 사용되는 메서드들이다.

  ○ 테이블형태로 정리해주는 함수 어플리케이션: pipe()

  ○ 행 혹은 열로 정리해주는 함수 어플리케이션: apply()

  ○ 집합 API: agg()transform()

  ○ 요소별 적용 함수: applymap()


본 포스팅에서는 transform() 메서드의 사용법에 대해 다루도록 한다.



 transform() 메서드


transform() 메서드는 입력된 객체와 동일하게 인덱스된 객체를 반환한다.

  ○ 사용자에게 하나하나 하기보다는 동일한 시간대에 다중연산(Multiple operation)을 가능하게 한다.

  ○ .agg() 메서드와 꽤나 유사한면이 있으나 다음과 같은 차이가 있다.

    ▷ agg() 메서드는 sum, mean 등 집계하는 함수 위주로 적용된다.

    ▷ transform() 메서드는 각 요소별로 적용되는데 적용된다.


메서드 사용 형식)

result=object.transform(func, axis=0, args, **kwargs)

 

각 입력 객체별 설명은 다음과 같다.

  ○ func: 이 입력변수는 pandas 객체의 열이나 행에 적용할 함수를 입력받는다.

  ○ axis: 함수를 적용할 축을 지정한다.

    ▷ Series에 적용될 경우 이 입력변수 0 or ‘index’만 사용할 수 있다.

    ▷ 0 or ‘index’: 함수를 각 열(columns)에 따라 적용한다.

    ▷ 1 or ‘columns’: 함수를 각 행(row)에 따라 적용한다.

  ○ *args: func에 입력되는 위치 입력변수를 입력받는다.

    ▷ iterable한 자료형을 입력받는다. (list, tuple 등)

  ○ **kwargs:  func에 입력되는 키워드 입력변수를 입력받는다.

    ▷ 키워드에 입력될 입력값의 mapping을 입력받는다.

 
 

 transform() 메서드 사용 예제

예제를 수행하기 위해 다음과 같이 모듈 import와 DataFrame을 정의한다.


모듈의 import 및 예제용 DataFrame의 정의)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 DataFrame의 정의

In[4]: sample_df= pd.DataFrame([[9.1, 1.2, 1.3, 1.4], [2.1, 9.2, 9.3, 2.4], [3.1, 3.2, 3.3, 3.4]], index=['a', 'b', 'c'], columns=['A','B','C','D'])


In[5]: sample_df

Out[5]: 

     A    B    C    D

a  9.1  1.2  1.3  1.4

b  2.1  9.2  9.3  2.4

c  3.1  3.2  3.3  3.4



메서드의 사용

transform() 메서드에는 Numpy 함수, 문자열 함수 이름 혹은 사용자 정의함수가 입력될 수 있다. 

transform() 메서드는 하나의 함수를 입력받는다. 이는 ufunc 어플리케이션과 동일하다.


메서드의 사용 예제)

# ex1-1: numpy 함수의 적용

In[6]: sample_df.transform(np.exp)

Out[6]: 

             A            B             C          D

a  8955.292703     3.320117      3.669297   4.055200

b     8.166170  9897.129059  10938.019208  11.023176

c    22.197951    24.532530     27.112639  29.964100


# ex1-2: 함수 문자열 입력

In[7]: sample_df.transform('exp')

Out[7]: 

             A            B             C          D

a  8955.292703     3.320117      3.669297   4.055200

b     8.166170  9897.129059  10938.019208  11.023176

c    22.197951    24.532530     27.112639  29.964100


# ex1-3: 람다함수의 사용

In[8]: sample_df.transform(lambda x: np.exp(x))

Out[8]: 

             A            B             C          D

a  8955.292703     3.320117      3.669297   4.055200

b     8.166170  9897.129059  10938.019208  11.023176

c    22.197951    24.532530     27.112639  29.964100

 

위의 연산은 아래와 같이 함수에 직접 pandas 객체를 넣는 것과 동일하다.


함수의 직접적용)

# 함수의 직접적용

In[9]: np.exp(sample_df)

Out[9]: 

             A            B             C          D

a  8955.292703     3.320117      3.669297   4.055200

b     8.166170  9897.129059  10938.019208  11.023176

c    22.197951    24.532530     27.112639  29.964100



Series로의 적용

Series를 사용하는 .transform() 메서드에 하나의 함수를 입력하는 것은 하나의 Series를 반환하게 된다.


Series로의 메서드 적용 예제)

# ex2: Series로의 메서드 적용 

In[10]: sample_df['C'].transform(np.exp)

Out[10]: 

a        3.669297

b    10938.019208

c       27.112639

Name: C, dtype: float64



다수의 함수 적용

여러 함수를 입력하는 것은 열이 멀티인덱스인 DataFrame을 반환한다.

첫 level(최상위 열 인덱스)은 기존 DataFrame의 열 인덱스로 설정된다.

두번째 level는 전달하는 함수의 이름이 들어가게 된다.


다수의 함수 적용 예제)

# ex3-1: 다수의 함수 적용 예제

In[11]: sample_df.transform(['exp', lambda x: np.exp(-x)])

Out[11]: 

             A                       B  ...          C          D           

           exp <lambda_0>          exp  ... <lambda_0>        exp <lambda_0>

a  8955.292703   0.000112     3.320117  ...   0.272532   4.055200   0.246597

b     8.166170   0.122456  9897.129059  ...   0.000091  11.023176   0.090718

c    22.197951   0.045049    24.532530  ...   0.036883  29.964100   0.033373

[3 rows x 8 columns]


transform()메서드에 Series를 적용하고 여기에 다중 함수를 입력하는 것은 DataFrame이 출력하게 만든다.


Series로의 다수의 함수 사용 예제)

# ex3-2: Series로의 다수의 함수 적용

In[12]: sample_df['A'].transform(['exp', lambda x: np.exp(-x)])

Out[12]: 

           exp  <lambda>

a  8955.292703  0.000112

b     8.166170  0.122456

c    22.197951  0.045049



딕셔너리의 사용

딕셔너리를 입력하는 것은 DataFrame 열이나 행에 따라 함수를 다르게 적용할 수 있게 한다.

  ○ 딕셔너리의 key는 함수가 적용되는 인덱스가 입력된다.

  ○ 딕셔너리의 value에는 적용되는 함수가 입력된다.


딕셔너리 사용의 예제)

# ex4-1: 딕셔너리의 사용 예제

In[13]: sample_df.transform({'A': 'exp', 'B':lambda x: np.exp(-x)})

Out[13]: 

             A         B

a  8955.292703  0.301194

b     8.166170  0.000101

c    22.197951  0.040762


list의 dict를 입력하는 것은 멀티인덱스를 가진 DataFrame을 출력으로 한하며 열마다 특정함수를 선택할 수 있도록 한다.


딕셔너리에 다수의 함수 사용 예제)

# ex4-2: 딕셔너리에 다수의 함수 사용 예제

In[14]: sample_df.transform({'A': 'exp', 'B':[np.exp, lambda x: np.exp(-x)]})

Out[14]: 

             A            B           

           exp          exp <lambda_0>

a  8955.292703     3.320117   0.301194

b     8.166170  9897.129059   0.000101

c    22.197951    24.532530   0.040762

 

 

 .transform(), applymap() 메서드 세부사항


이 메서드는 pandas 객체에 다수의 함수를 적용하는데 사용된다.


 DataFrame.transform(func, axis=0, raw=False, result_type=None, args=(), **kwds)


func: function, str, list or dict

데이터를 변환하기 위한 함수를 입력받는다.

이 함수에는 반드시 DataFrame가 입력되거나 DataFrame.apply가 입력될때 작동해야한다. 

다음과 같은 조합이 사용될 수 있다.

  ○ 함수

  ○ 문자열로된 함수 이름

  ○ 함수 혹은 함수 이름(문자열)의 리스트(예: np.sum, 'mean')

  ○ 키를 축 레이블을 가지며 값에 함수 혹은 함수이름의 리스트를 가지는 딕셔너리


axis: {0 or ‘index’, 1 or ‘columns’}

기본값은 0으로 함수를 각 열에 따라 적용하게 되어있다.

Series에 이 메서드가 적용될 경우 0 혹은 'index'만 사용 가능하다.

함수를 적용할 축을 지정한다.

  ○ 0 or ‘index’: 함수를 각 열(columns)에 따라 적용한다.

  ○ 1 or ‘columns’: 함수를 각 행(row)에 따라 적용한다.


*args

func에 입력되는 함수의 위치 입력변수를 입력받는다.


**kwargs

func에 입력되는 함수의 추가적인 키워드 입력변수를 입력받는다.



 

 

 

 

 참고자료

  https://pandas.pydata.org/docs/user_guide/basics.html

  https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.transform.html

 

 

 

 



반응형

댓글