2019.08.29 pandas.DataFrame.groupby에 특정 함수를 선언하여 적용하는 방법
오늘 볼 코드 입니다.
import pandas as pd
df=pd.read_excel('groupby_예제.xlsx')
price_group=df['price'].groupby(df.index)
def calc(group):
return max(group)*min(group)
price_group.agg(calc)
오늘 사용한 예제입니다.
오늘 사용한 모듈입니다.
- pandas
- pandas.DataFrame.groupby
코드와 예제 파일은 깃헙에서 확인하실 수 있습니다. 깃헙 주소입니다.
https://github.com/pakupoko/blog_code
최근에 배운 pandas.DataFrame 기능을 하나 더 가져와 봤습니다. groupby라고 불리는 이 기능은, 지정한 칼럼의 중복값들을 묶어내고, 나머지 칼럼의 값들을 시리즈 형태로 연결시켜 줍니다. 그리고 groupby에 내장된 메소드들을 통해 원하는 결과를 도출 할 수 있죠.
price_group=df['price'].groupby(df.index)
groupby는 먼저 '묶어내려고 하는' 칼럼과 '기준' 칼럼을 정하여야 합니다. 위의 코드를 보면 알겠지만, 저는 index의 여러 제품(편의상 알파벳으로 표현)을 '기준'으로 하여 'price' 칼럼을 묶어내려고 합니다.
위의 코드만 치면 원하시는 칼럼을 기준으로 다른 칼럼을 묶어냅니다. 하지만 저 상태에서 끝난 것이 아닙니다.
groupby한 변수를 출력하면 저런 식의 특성만 출력하고 끝납니다. 하지만 저 표현은 groupby 객체가 생성되었다는 의미를 지니고 있습니다. 이제 생성된 객체에 groupby 메소드를 사용하여 원하는 값을 도출 할 수 있습니다.
price_group.sum()
groupby의 sum 메소드 예시입니다. sum을 이용하면 각 기준 Series의 합을 도출하게 됩니다.
평균을 구하거나, 최대값, 최소값을 구하는 등 다양한 메소드가 존재합니다. 메소드의 설명 및 groupby에 대한 자세한 기능을 배우고 싶으신 분이 있다면 groupby의 documentation를 참고하시기 바랍니다. 밑에 링크를 달아 두었습니다.
https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html
저희가 오늘 볼 예시는, 이런 값들 말고 직접 지정한 함수로 묶인 값을 계산하려고 할 때는 어떻게 진행하느냐 입니다.
이런 문제를 해결하기 위해, groupby에는 이미 자기가 원하는 함수를 적용하는 메소드가 존재합니다.
바로 agg, 혹은 aggregate라는 메소드 입니다. 이 메소드에 매개값으로 함수를 전달하면, 해당 함수로 묶인 값들을 계산하게 됩니다.
어떤식으로 작동하는 지, 예시 코드를 통해 알아보겠습니다.
def check(group):
print(group)
price_group.agg(check)
예제 코드와 결과 입니다. 어떤 값이 들어가고 어떤 식으로 결과가 도출되는지 확인할 수 있습니다. 제품 명으로 이루어진 인덱스와 각 가격들이 Series 형태로 함수로 입력되고, 메소드 계산 결과로 unique한 제품명이 인덱스로 만들어진 Series가 출력됩니다.
지금은 함수에 반환 값을 지정하지 않았으니 None 값으로 출력되었는데, 그렇다면 함수에 계산을 때리고 반환 값을 지정하면 원하는 Series가 만들어질 것 같습니다.
그럼 묶인 값들 중에서, 최대값과 최소값만 가져와서 곱한 값을 반환하는 함수를 선언해보도록 하죠.
def calc(group):
return max(group)*min(group)
price_group.agg(calc)
저는 단순하게 만들었습니다. Series의 최대값을 max 함수로 받고, 최소값은 min 함수로 받아 서로 곱한 값을 반환하게 설계했습니다.
결과 또한 잘 나왔네요. 이렇게 agg메소드를 이용하면 임의로 지정한 계산식을 groupby 객체에 적용할 수 있습니다.
지금 예시는 비록 가볍게 만들긴 했지만, 좀 더 정교한 설계를 통해 수많은 데이터에 복잡한 수식을 적용할 수도 있을 것입니다.
오늘 배운 내용은 여기까지 입니다. 참신한 코드를 배우게 되면 또 가져오도록 하겠습니다.






댓글
댓글 쓰기