반응형

03-03. 함수내 함수 연속적용 (pipe)


DataFrame.pipe(func, args, kwargs)

 

개요


pipe 메서드는 함수를 연속적으로 사용할 때 유용한 메서드입니다.
특히 함수가 인수를 사용할 때 pipe 메서드를 사용하면 보다 직관적으로 적용할 수 있습니다

 

사용법


기본 사용법
df.pipe(func, args, kwargs)
func : 함수입니다.
arg : 함수의 인수입니다.
kwargs : dict 형태의 함수의 인수입니다.

만약 함수 3개가 아래와 같이 있다고 해봅니다.
f1(data, arg1)f2(data, arg1, arg2), f3(data, arg3)
f1 > f2 > f3 순서로 포함되게 함수를 사용한다고 하면 아래와 같이 함수를 사용해야 합니다.
df=f1( f2( f3( data,arg3='c' ),arg2='b1',arg3='b2' ),arg1='a' )
이는 어떤 arg가 어떤함수인지 직관적으로 볼 수 없습니다. 이때, pipe함수를 사용할 수 있습니다.
df=data.pipe(f3, arg3='c').pipe(f2, arg2='b1', arg3='b2').pipe(f3, arg3='c')

반응형

 

예시


먼저 입력 데이터를 정의해보겠습니다.

org_data = pd.DataFrame({'info':['삼성전자/3/70000','SK하이닉스/2/100000']})
print(org_data)
>>
              info
0     삼성전자/3/70000
1  SK하이닉스/2/100000

그리고 함수 두개를 만들어보겠습니다.
code_name(data) 는 (종목명/수량/가격)형태인 문자열 data를 입력받아서 각각으로 분리하고 수량과 가격의 dtypeint로 변경하는 함수 입니다.

def code_name(data):
    result=pd.DataFrame(columns=['name','count','price']) 
    df = pd.DataFrame(list(data['info'].str.split('/'))) # '/ ' 로 구분하여 문자열을 나누어 리스트에 넣음
    result['name'] = df[0] # 여기엔 첫번째 값인 이름이 입력
    result['count']= df[1] # 여기엔 두번째 값인 수량이 입력
    result['price']= df[2] # 여기엔 세번째 값인 가격이 입력
    result = result.astype({'count':int,'price':int}) # count와 price를 int로 바꿈(기존str)
    return result
print(code_name(org_data))
>>
     name  count   price
0    삼성전자      3   70000
1  SK하이닉스      2  100000

value_cal(data,unit=' ')은 가격과 수량을 곱한다음에 단위로 unit arg를 붙이는 함수입니다.

def value_cal(data,unit=''):
    result = pd.DataFrame(columns=['name','value']) 
    result['name'] =data['name'] # 이름은 기존거를 가져옴
    result['value']=data['count']*data['price'] # value는 count * price를 입력함
    result = result.astype({'value':str}) # value를 str로 변경(단위를 붙이기 위함)
    result['value']=result['value']+unit # 단위를 붙임
    return(result)

input=code_name(org_data)
print(value_cal(input,'원'))
>>
     name    value
0    삼성전자  210000원
1  SK하이닉스  200000원

pipe 메서드를 사용하지 않는경우
만약 pipe메서드를 사용하지 않는다면 아래와같이 함수를 사용해야 합니다.

print(value_cal(code_name(org_data),'원'))
>>
     name    value
0    삼성전자  210000원
1  SK하이닉스  200000원


pipe메서드를 사용한다면 아래와같이 직관적으로 나타낼 수 있다.

print(org_data.pipe(code_name).pipe(value_cal,'원'))
>>
     name    value
0    삼성전자  210000원
1  SK하이닉스  200000원
반응형

+ 최근 글