파이썬 버전 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 |
|
|
|
|
'Python > Pandas' 카테고리의 다른 글
요소별 함수의 적용 applymap(), map() 메서드-pandas(35) (0) | 2020.10.10 |
---|---|
다중(여러개) 함수 적용 transform() 메서드-pandas(34) (0) | 2020.10.09 |
행과 열로의 함수 적용을 위한 apply() 메서드-pandas(32) (0) | 2020.10.07 |
연속적인 함수적용을 위한 pipe() 메서드-pandas(31) (0) | 2020.10.05 |
인덱스(레이블) 수정을 위한 rename() 메서드-pandas(30) (0) | 2020.09.13 |
댓글