본문 바로가기
Python/Pandas

다수(여러개)의 함수 사용을 위한 agg() 메서드-pandas(33)

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

파이썬 버전 3.8 기준

pandas 버전 1.1.1 기준


 다수의 함수 사용을 위한 agg()


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

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

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

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

  ○ 집합 API: agg()transform()

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


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

 

 agg() 메서드


agg() 메서드는 사용자에게 다중집계작업(multiple aggregation operation)을 간결하게 나타낼수 있도록 한다.

이 메서드는 apply() 메서드와 유사한 면이 존재하나, 이 메서드는 한번의 메서드에 여러 함수를 동시에 입력하고 결과를 출력할 수 있다는 차이점이 존재한다.


agg()와 aggregate() 메서드는 동일한 메서드이며, 적용방식은 아래와 같다.


메서드 사용 형식)

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

result=object.aggregate(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을 입력받는다.


 agg()메서드 사용 예제

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


모듈의 임폴트)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np



메서드 사용 예제

단순한 사용예제는 다음과 같다.

  ○ 하나의 함수를 사용하는 것은 apply() 메서드를 사용하는 것과 동일하다.

  ○ 사용자는 문자열로 이름이 명명된 메서드를 입력할 수 있다.

  ○ 이것들은 집약된 출력으로 구성된 Series를 반환한다.


메서드의 적용 예제)

# 예제용 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'])


# ex1-1: 메서드 적용

In[5]: sample_df.agg(np.sum)

Out[5]: 

A    14.3

B    13.6

C    13.9

D     7.2

dtype: float64


# ex1-2: 문자열을 이용한 메서드 적용

In[6]: sample_df.agg('sum')

Out[6]: 

A    14.3

B    13.6

C    13.9

D     7.2

dtype: float64


# ex1-3: axis를 이용한 적용 축의 변경 예제

In[7]: sample_df.agg('sum', axis=1)

Out[7]: 

a    13.0

b    23.0

c    13.0

dtype: float64



Series로의 메서드 적용 예제

Series에 대해 메서드를 적용할 시 하나의 스칼라 값을 반환한다.


Series에 대한 메서드 적용 예제)

# ex2: Series에 대한 메서드 적용 예

In[8]: sample_df['A'].agg('sum')

Out[8]: 14.299999999999999



여러 함수 입력 예제

사용자는 다중집계입력변수를 리스트로 입력할 수 있다.

  ○ 리스트를 입력하여 다수의 함수에 대해 입출력이 가능하다.

  ○ 각각의 입력된 함수의 결과는 DataFrame의 하나의 행으로 출력된다.

  ○ 다중함수는 다중 열을 출력한다.

  ○ 각 행의 이름은 aggregation function을 통해 자동적으로 명명된다.


리스트를 통한 함수 입력 예제)

# ex3-1: 함수로 구성된 리스트의 입력

In[9]: sample_df.agg(['min'])

Out[9]: 

       A    B    C    D

min  2.1  1.2  1.3  1.4


# ex3-2: 다수의 함수로 구성된 리스트의 입력

In[10]: sample_df.agg(['sum', 'mean', 'max', 'min'])

Out[10]: 

              A          B          C    D

sum   14.300000  13.600000  13.900000  7.2

mean   4.766667   4.533333   4.633333  2.4

max    9.100000   9.200000   9.300000  3.4

min    2.100000   1.200000   1.300000  1.4


# ex3-3: 명시된 축의 변경 예제

In[11]: sample_df.agg(['sum', 'mean', 'max', 'min'], axis=1)

Out[11]: 

    sum  mean  max  min

a  13.0  3.25  9.1  1.2

b  23.0  5.75  9.3  2.1

c  13.0  3.25  3.4  3.1


Series를 기반으로 한다면, 다중함수는 Series를 반환하며, 함수 이름으로 인덱싱이된다.


Series에서의 다중함수 입력 예제)

# ex4: Series에서의 다중함수 입력 예제

In[12]: sample_df['B'].agg(['sum', 'mean', 'max', 'min'])

Out[12]: 

sum     13.600000

mean     4.533333

max      9.200000

min      1.200000

Name: B, dtype: float64



람다함수의 사용

만약 lambda 함수를 입력한다면 <lambda>라는 이름으로 인덱싱된다.

 

람다함수의 사용 예제)

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

In[13]: sample_df['B'].agg(['sum', lambda x: x.sum()])

Out[13]: 

sum         13.6

<lambda>    13.6

Name: B, dtype: float64



사용자 정의 함수 사용

사용자 정의 함수를 사용할 경우 기본적으로 그 함수의 이름을 따른다.

하지만 따로 이름이 명명된 함수를 입력한다면 명명된 이름이 행의 이름으로 인덱싱된다.

 

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

# 예제용 함수 적용

In[14]: def ex_func(x):

...:    return x.sum()

...:    


# ex6-1: 사용자 정의 함수의 적용 예제

In[15]: sample_df['B'].agg(['sum', ex_func])

Out[15]: 

sum        13.6

ex_func    13.6

Name: B, dtype: float64


# ex6-2: 이름이 변경된 함수의 적용 예제

In[16]: ex_func.__name__='function name changed'


In[17]: sample_df['B'].agg(['sum', ex_func])

Out[17]: 

sum                      13.6

function name changed    13.6

Name: B, dtype: float64



딕셔너리를 통한 함수 입력

딕셔너리를 사용하여 함수를 agg() 메서드에 입력하면, 열이나 행마다 적용되는 함수를 다르게 설정할 수 있다.

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

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

  ○ 순서가 있는 딕셔너리를 사용한다면 결과 순서를 조정 할 수 있다.


딕셔너리를 통한 함수입력 예제)

# ex7-1: 딕셔너리를 통한 함수 입력

In[18]: sample_df.agg({'A': 'sum', 'B': 'max' , 'C': 'min', 'D': 'min'})

Out[18]: 

A    14.3

B     9.2

C     1.3

D     1.4

dtype: float64


딕셔너리의 값(value)에 함수의 리스트(혹은 리스트와 유사한 자료형)를 입력하면, DataFrame을 출력한다.

  ○ 모든 함수에 대해 행 혹은 열이 생성되며 matrix와 같은 출력을 얻는다.

  ○ 특정 열에는 적용됬지만 다른열에는 적용되지 않은 함수의 결과는 NaN으로 출력된다.


딕셔너리와 리스트의 조합 예제)

# ex7-2: 딕셔너리와 리스트 조합 예제

In[19]: sample_df.agg({'A': ['sum', 'mean'], 'B': 'max' , 'C': 'min', 'D': 'min'})

Out[19]: 

              A    B    C    D

max         NaN  9.2  NaN  NaN

mean   4.766667  NaN  NaN  NaN

min         NaN  NaN  1.3  1.4

sum   14.300000  NaN  NaN  NaN


여러 dtypes이 존재하는 경우

다수의 dtype을 포함하더라도 .agg() 메서드를 적용할 수 있다.

  ○ 이것은 .groupby() .agg()의 작동하는 원리와 유사하다.

  ○ 입력된 함수가 특정 자료형에 적용할 수 없는 경우 NaN으로 출력한다.


여러 dtype이 존재하는 객체의 메서드 적용 예제)

# 예제용 DataFrame의 정의

In[20]: sample_df = pd.DataFrame({'A': [1,1,1], 'B': [1.1,1.2,1.3], 'C':['hi', 'hello',  "what's up"]})


# ex8: 여러 dtype이 존재하는 객체의 메서드 적용 예제

In[21]: sample_df.agg(['sum', 'mean'])

Out[21]: 

        A    B                 C

sum   3.0  3.6  hihellowhat's up

mean  1.0  1.2               NaN



사용자에게 맞춘 결과 정리 코드 작성

.agg()를 사용한다면, 사용자가 원하는 형식으로 데이터를 정리할 수 있는 함수를 만들 수 있다.

이는 describe function(링크)와 유사하다.


사용 예제)

# 예제용 DataFrame과 함수의 정의

In[22]: pd.DataFrame({'A': [1,1,1], 'B': [1.1,1.2,1.3], 'C':['hi', 'hello',  "what's up"]})


In[23]: def user_mean_func(x):

...:    return x.sum()/x.count()

...:


In[24]: user_mean= user_mean_func

In[25]: user_mean.__name__ = 'Defined_func'


# ex9: 사용자 맞춤 데이터 정리 코드 작성 예제

In[26]: sample_df.agg(['sum', user_mean,'max','min'])

Out[26]: 

                A    B                 C

sum           3.0  3.6  hihellowhat's up

Defined_func  1.0  1.2               NaN

max           1.0  1.3         what's up

min           1.0  1.1             hello




 agg() 메서드 세부사항


이 메서드는 명시된 축에 따라 하나 혹은 그 이상이 연산을 사용하여 종합한다.


 DataFrame.agg(func=None, axis=0, *args, **kwargs)


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.agg.html

 

 

 

 



반응형

댓글