파이썬 버전 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 입력변수를 통한 출력되는 자료형의 조정
○ 만약에 함수가 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변수의 적용
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 |
|
|
|
|
'Python > Pandas' 카테고리의 다른 글
다중(여러개) 함수 적용 transform() 메서드-pandas(34) (0) | 2020.10.09 |
---|---|
다수(여러개)의 함수 사용을 위한 agg() 메서드-pandas(33) (0) | 2020.10.08 |
연속적인 함수적용을 위한 pipe() 메서드-pandas(31) (0) | 2020.10.05 |
인덱스(레이블) 수정을 위한 rename() 메서드-pandas(30) (0) | 2020.09.13 |
두 객체의 데이터 정렬을 위한 align() 메서드 - pandas(29) (0) | 2020.09.11 |
댓글