본문 바로가기
Python/Pandas

연속적인 함수적용을 위한 pipe() 메서드-pandas(31)

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

파이썬 버전 3.8 기준

pandas 버전 1.1.1 기준


 연속적인 함수적용을 위한 pipe() 메서드


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

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

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

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

  ○ 집합 API: agg()transform()

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


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


 pipe() 메서드


pipe()메서드는 pandas 객체에 함수를 적용하게 해주는 메서드이다.

함수에 pandas 객체를 입력해도 된다. 

하지만 pipe() 메서드를 사용하면 pandas 객체에 여러 개의 함수를 동시에 적용할 때 더 깔끔하고 보기 좋게 만들 수 있다.

  ○ 즉, 함수를 연속적으로 호출해야하는 경우에 pipe()메서드를 사용하는 것이 권장된다.

  ○ pipe() 메서드는 메서드를 연속적으로 사용할 수 있게 함으로써 라이브러리 함수를 사용하기 쉽게 만들어준다.


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


메서드 사용 형식)

result=object.pipe(func, *args, **kwargs)

 

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

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

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

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

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

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

 

 pipe() 메서드 적용 예제

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

  ○ 아래에서 작성한 함수들은 DataFrame을 입력과 출력으로 가지는 함수들이다.


모듈의 임폴트 및 예제에 사용할 함수의 정의)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제 함수의 정의

In[4]: def extract_info(data):

...:    dummy=pd.DataFrame(list(data['name_score'].str.split(',')))

...:    data['name'] = dummy[0]

...:    data['score'] = dummy[1]

...:    return data

...:

In[5]: def add_class(data, classname='NoClass'):

...:    data['name_with_class'] = data['name'] + '_' + classname

...:    return data

...:

   

pipe() 메서드 적용 예제

그리고 아래의 예제는 2가지 방법을 통해 함수를 적용한 예제이다.

  ○ 첫번째 방법: 일반적인 방법으로의 함수 적용

  ○ 두번째 방법: pipe메서드를 사용한 연속적인 함수 적용.

 

pandas는 여기서 두번째 스타일을 사용하는 것을 권장한다. 그리고 이는 메서드 체이닝(method chaining)으로 알려져있다.

pipe() 메서드는 메서드를 연속적으로 사용할 수 있게 함으로써 라이브러리 함수를 사용하기 쉽게 만들어준다.

 

pandas 객체로의 함수 적용 예제)

# 예제용 DataFrame 정의

In[6]: sample_df = pd.DataFrame({'name_score': ['Younghee, 100', 'Chuulsoo, 040'] } )

In[7]sample_df 

      name_score      name score 

0  Younghee, 100  Younghee   100 

1  Chuulsoo, 040  Chuulsoo   040  



# ex1-1: 일반적인 방법으로 함수 적용 

In[8]: add_class(extract_info(sample_df), classname= 'sun')

Out[8]: 

      name_score      name score name_with_class

0  Younghee, 100  Younghee   100    Younghee_sun

1  Chuulsoo, 040  Chuulsoo   040    Chuulsoo_sun


# ex1-2: pipe 메서드를 활용한 함수 적용

In[9]: sample_df = pd.DataFrame({'name_score': ['Younghee, 100', 'Chuulsoo, 040'] } )


In[10]: sample_df.pipe(extract_info).pipe(add_class, ['sun'])

Out[10]: 

      name_score      name score name_with_class

0  Younghee, 100  Younghee   100    Younghee_sun

1  Chuulsoo, 040  Chuulsoo   040    Chuulsoo_sun

 

함수의 키워드 입력변수 활용

위의 예제에선 적용되는 함수의 위치입력변수를 통하여 함수를 적용하였다.

아래 예제는 적용되는 함수의 키워드 입력변수를 입력받아 함수를 적용하는 것을 보여준다. 

 

키워드 입력변수의 활용)

# 예제용 DataFrame의 정의

In[11]: sample_df = pd.DataFrame({'name_score': ['Younghee, 100', 'Chuulsoo, 040'] } )


# ex2: 키워드 입력변수를 통한 함수 입력 예제

In[12]: sample_df.pipe(extract_info).pipe(add_class, classname= 'good')

Out[12]: 

      name_score      name score name_with_class

0  Younghee, 100  Younghee   100   Younghee_good

1  Chuulsoo, 040  Chuulsoo   040   Chuulsoo_good

  

선택적 입력변수 활용

함수의 입력변수에 튜플과 같은 자료형을 활용하면 커스터마이징된 결과를 출력할 수 있다.


선택적 입력변수 적용)

# 예제용 DataFrame의 정의

In[13]: sample_df = pd.DataFrame({'name_score': ['Younghee, 100', 'Chuulsoo, 040'] } )


# ex3: 튜플을 활용한 선택적 입력변수 적용 예제

In[14]: sample_df.pipe(extract_info).pipe(add_class, ('good','sun'))

Out[14]: 

      name_score      name score name_with_class

0  Younghee, 100  Younghee   100   Younghee_good

1  Chuulsoo, 040  Chuulsoo   040    Chuulsoo_sun

 

적용하려는 함수의 위치가 첫번째가 아닌 경우

위에서는 pipe() 메서드에 입력되는 함수의 첫번째 위치에 적용되는 pandas 객체가 입력으로 들어가는 경우에 대해 다뤘다.

만약 pandas객체가 함수의 두 번째 입력으로 사용하는 경우는 어떻게 할까?

이 경우에는 pipe() 함수에 (callable, data_keyword)과 같이 튜플을 사용하면된다.

  ○ 여기서 callable은 함수를 의미하며, data_keyword는 pandas객체가 입력될 키워드변수명을 의미한다.

pipe() 메서드는 DataFrame을 튜플에 지정된 입력에 따라 pandas객체를 입력한다.

 

적용하려는 함수의 위치가 첫번째가 아닌 경우의 예)

# 예제용 함수의 정의

In[15]: def add_class(classname='NoClass', data=pd.DataFrame()):

...:    data['name_with_class'] = data['name'] + '_' + classname

...:    return data

...:    


In[16]: sample_df.pipe(extract_info).pipe((add_class, 'data'), 'good')

Out[16]: 

      name_score      name score name_with_class

0  Younghee, 100  Younghee   100   Younghee_good

1  Chuulsoo, 040  Chuulsoo   040   Chuulsoo_good

 

 

 .pipe() 메서드 세부사항


이 메서드는 pandas 객체에 함수를 적용할 수 있게 해주는 메서드이며, 연속적으로 함수를 사용할 시 유용하다.

 

 DataFrame.pipe(func, *args, **kwargs)


func: function

pipe() 메서드가 Series/DataFrame에 적용되는 함수를 입력받는다. 

입력된 함수 func에는 *args**kwargs에 입력된 변수를 입력받아 역할을 수행한다.

 

Function to apply to the Series/DataFrame. args, and kwargs are passed into func. Alternatively a (callable, data_keyword) tuple where data_keyword is a string indicating the keyword of callable that expects the Series/DataFrame.


args: iterable, optional

func에 입력될 위치 입력변수를 입력받는다.


kwargs: mapping, optional

func에 입력될 키워드 입력변수의 매핑을 입력받는다.



 

 

 

 

 참고자료

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

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

 

 

 

 

 

반응형

댓글