파이썬 버전 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 |
|
|
|
|
'Python > Pandas' 카테고리의 다른 글
pandas에서의 통계함수(메서드)-pandas(36) (0) | 2020.10.11 |
---|---|
요소별 함수의 적용 applymap(), map() 메서드-pandas(35) (0) | 2020.10.10 |
다수(여러개)의 함수 사용을 위한 agg() 메서드-pandas(33) (0) | 2020.10.08 |
행과 열로의 함수 적용을 위한 apply() 메서드-pandas(32) (0) | 2020.10.07 |
연속적인 함수적용을 위한 pipe() 메서드-pandas(31) (0) | 2020.10.05 |
댓글