본문 바로가기
Python/Pandas

행과 열로의 함수 적용을 위한 apply() 메서드-pandas(32)

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

파이썬 버전 3.8 기준

pandas 버전 1.1.1 기준


 행과 열로의 함수 적용을 위한 apply() 메서드


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

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

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

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

  ○ 집합 API: agg()transform()

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


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

 

 apply() 메서드


apply()메서드는 pandas 객체에 열 혹은 행에 대해 함수를 적용하게 해주는 메서드이다.

apply() 메서드의 적용방식은 아래와 같다.


메서드 사용 형식)

result=object.apply(func, axis=0, raw=False, result_type=None, args=(), **kwds)

 

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

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

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

    ▷ Series에 적용될 경우 이 입력변수는 고려하지 않는다.

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

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

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

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

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

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

 

result_type 입력변수를 통한 출력되는 자료형의 조정

apply() 메서드에 입력되는 함수의 반환되는 데이터타입은 DtatFrame.apply()의 마지막 출력의 데이터 타입에 영향을 미친다.

  ○ 만약에 함수가 Series를 반환한다면, 마지막 출력은 DataFrame이다. 적용되는 함수에 의해 열은 Series의 인덱스와 매치된다.

  ○ 적용되는 함수가 어떤 다른 형태의 데이터타입을 반환할 수 있면, 마지막 출력은 Series이다.


위의 기본적인 거동 외에 result_type을 이용함으로써 출력되는 데이터 타입을조절 할 수 있다.  

  ○ 3가지 옵션을 가진다. reduce, broadcast, expand

  ○ 이것들은 list와 같은 반환 값이 DataFrame으로 확장되거나 확장되지 않는 방식을 결정한다.


raw 입력변수를 통한 계산되는 자료형의 정의

최종적으로, apply() 메서드는 raw 입력변수를 가진다.

  ○ 이 입력변수는 False가 기본값으로 되어있으며, 각 행이나 열을 함수를 적용하기 전에 Series로 바꿔준다.

  ○ 이 True가 입력될 경우 func에 입력된 함수는 메서드가 적용되는 pandas객체를 ndarray 객체로 입력 받는다. 

    ▷ ndarray객체를 사용함으로써 인덱싱 기능이 필요하지 않은 경우 성능개선을 노릴 수 있다.

  

 apply() 메서드 적용 예제

예제를 수행하기 위해 다음과 같이 셋업을 수행한다.


모듈의 임폴트)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


apply()메서드 사용 예제

apply() 메서드를 사용하면, DataFrame의 축을 따라서 임의의 함수가 적용될 수 있다.  

  ○ 축을 선택하기 위해 axis 입력이 존재한다.

아래 예제는 apply()메서드 사용 예를 보여준다.


메서드 사용 예제)

# 예제용 DataFrame의 정의

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


# ex1-1: numpy 함수의 적용

In[5]: sample_df.apply(np.mean)

Out[5]: 

A    2.1

B    2.2

C    2.3

D    2.4

dtype: float64


# ex1-2: numpy 함수와 axis변수의 적용

In[6]: sample_df.apply(np.mean, axis=1)

Out[6]: 

a    1.25

b    2.25

c    3.25

dtype: float64


# ex1-3: np.cumsum 함수의 적용

In[7]: sample_df.apply(np.cumsum)

Out[7]: 

     A    B    C    D

a  1.1  1.2  1.3  1.4

b  3.2  3.4  3.6  3.8

c  6.3  6.6  6.9  7.2


# ex1-4: np.cumsum 함수와 axis변수의 적용

In[8]: sample_df.apply(np.cumsum, axis=1)

Out[8]: 

     A    B    C     D

a  1.1  2.3  3.6   5.0

b  2.1  4.3  6.6   9.0

c  3.1  6.3  9.6  13.0


# ex1-5: 요소별로 적용되는 numpy 함수의 적용

In[9]: sample_df.apply(np.exp)

Out[9]: 

           A          B          C          D

a   3.004166   3.320117   3.669297   4.055200

b   8.166170   9.025013   9.974182  11.023176

c  22.197951  24.532530  27.112639  29.964100



문자열 입력을 통한 메서드 적용 예제

apply() 메서드는 또한 문자열로된 메서드 명령어를 인식한다.

 

문자열을 이용한 메서드 적용 예제)

# ex2: 문자열을 이용한 메서드 적용 예제

In[10]: sample_df.apply('mean')

Out[10]: 

A    2.1

B    2.2

C    2.3

D    2.4

dtype: float64



람다함수의 적용

다양하게 방식으로 apply() 메서드를 적용할 수 있으며 이는, 데이터 집합에 대해 다양한 함수를 적용할 수 있게한다.

예를들어 각각의 열에서 최대값이 있는 인덱스가 있는 데이터를 원한다면 다음과 같이 구할 수 있다.

 

람다함수의 적용 예제)

# 예제용 DataFrame의 정의

In[11]: 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'])


# ex3: 람다함수의 적용 예제

In[12]: sample_df.apply(lambda x: x.idxmax())

Out[12]: 

A    a

B    b

C    b

D    c

dtype: object


In[13]: sample_df.apply(lambda x: x.idxmax(), axis=1)

Out[13]: 

a    A

b    C

c    D

dtype: object

 


사용자 정의 함수와 함수의 추가입력변수 사용 예제

사용자는 필요에 따라 사용자가 정의한 함수를 적용할 수 있다.

또한 추가적인 입력변수와 키워드 입력변수를 apply() 메서드에 입력할 수 있다.

예를들어 아래의 함수를 고려해보자.

사용자는 이때 이 함수를 다음과 같이 적용할 수 있다.

 

사용자 정의 함수 및 함수의 추가 입력변수 사용 예제)

# 예제용 사용자 함수의 정의

In[14]: def sample_f(inp1, inp2, sub=5):

...:    return inp1 + inp2 - sub

...: 


# 예제용 DataFrame 정의

In[15]:  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'])


# ex4: 사용자정의 함수 및 추가 입력변수 사용 예제

In[16]: sample_df.apply(sample_f, args=(100,), sub=50)

Out[16]: 

      A     B     C     D

a  59.1  51.2  51.3  51.4

b  52.1  59.2  59.3  52.4

c  53.1  53.2  53.3  53.4



Series 함수의 사용 예제

이 메서드의 유용한 특징중 하나는 각 열이나 행에서 Series 연산을 수행하기 위해 Series 함수들을 입력할 수 있다는 점이 있다.

 

Series 함수의 사용 예제)

# 예제용 DataFrame 정의

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

In[18]: sample_df

Out[18]: 

     A    B    C    D

a  9.1  NaN  1.3  1.4

b  2.1  9.2  NaN  2.4

c  NaN  3.2  3.3  3.4


# ex5: Series 함수 적용 예제

In[2]: sample_df.apply(pd.Series.fillna, method='ffill')

Out[27]: 

     A    B    C    D

a  9.1  NaN  1.3  1.4

b  2.1  9.2  1.3  2.4

c  2.1  3.2  3.3  3.4


In[2]: sample_df.apply(pd.Series.fillna, method='ffill', axis=1)

Out[28]: 

     A    B    C    D

a  9.1  9.1  1.3  1.4

b  2.1  9.2  9.2  2.4

c  NaN  3.2  3.3  3.4

 

 

 .apply() 메서드 세부사항


이 메서드는 열 혹은 행 방향으로 함수를 적용하는 메서드이다.


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


func: function

각 열(columns)이나 행(row)에 적용할 함수를 입력받는다.


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

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

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

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

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


raw: bool, default False

기본값은 False이다.

열 혹은 행이 Series나 ndarray 중 어떤 것으로 적용될지 결정한다.

  ○ True: 각 열 혹은 행을 Series로 입력시킨다.

  ○ False: 각 열 혹은 행을 ndarray로 입력시킨다. 

    ▷ 만약 사용자가 단지 Numpy 제거함수를 적용한다면, 이 옵션을 통해 더 나은 성능을 모색할수 있다.


result_type: {‘expand’, ‘reduce’, ‘broadcast’, None}

이것은 axis=1 or 'columns' 일 때만 작동한다.

기본값은 None이며, 이때는 적용되는 함수에 의존하여 결과를 반환한다.

list-like 결과는 Series로 반환되지만, 만약에 함수가 Series로 반환되면 열로 확장된다.

  ○ ‘expand’ : 열에 리스트와 유사한(list-like) 결과가 반환된다.

  ○ ‘reduce’ : 만약 리스트와 유사한(list-like) 결과가 보다 확장될 가능성이 있다면, Series를 반환한다.

    ▷ 이것은 'expand'와 반대이다.

  ○ ‘broadcast’ : 결과와 기존의 DataFrame 형태에 브로드캐스팅이 된다. 

    ▷ 기존의 인덱스와 열을 그대로 보유한다.


args: tuple

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

배열 혹은 Series로 입력받는다.


**kwds

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

 

 Series.apply(func, convert_dtype=True, args=(), **kwds)


func: function

Python 함수 혹은 Numpy의 ufunc를 입력받는다.


convert_dtype: bool

기본값은 True이다. 

각 요소에 더 나은 dtype을 찾는 것을 시도한다.

False일 경우 dtype을 객체(object)와 동일하게 남겨둔다.


args: tuple

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

배열 혹은 Series로 입력받는다.


**kwds

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



 

 

 

 

 참고자료

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

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

 

 

 

 



반응형

댓글