ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • pandas groupby 활용하기
    데이터분석 2019. 10. 10. 20:18

    데이터분석시, 특정 조건의 group별 연산이 매우 빈번하게 발생합니다. Pandas DataFrame에서 해당 작업들을 처리하는 방식을 알아봅니다.

    01. groupby basic

    기본적인 데이터 집계 방법을 살펴봅니다.

    # DataFrameGroupBy object 생성
    grouped = mydf.groupby('mycolumn')
    
    # DataFrameGroupBy object는 Iterable
    for name, group in grouped:
        print(name)
        display(group)
    
    # 각 그룹별 head 확인도 가능
    grouped.head(3).head(5)
    
    # 집계 방법1 -> {열:연산} dict를 입력
    mydf.groupby('mycolumn').agg({'agg_col': 'sum'})
    
    # 집계 방법2 -> 컬럼 선택후 연산자만 전달
    mydf.groupby('mycolumn').['agg_col'].agg('sum')
    mydf.groupby('mycolumn').['agg_col'].agg(numpy.sum)
    
    # 집계 방법2 -> agg 메서드 없이 바로 연산 함수 활용 가능
    mydf.groupby('mycolumn').['agg_col'].sum()

    02. multi columns and aggs

    여러 개의 항목들을 활용하여 집계하는 방법에 대해 알아봅니다.

    # 2개 columns 그룹핑
    mydf.groupby(['col1', 'col2']).['agg_col'].sum()
    
    # 2개 columns 그루핑, 2개 columns 집계
    mydf.groupby(['col1', 'col2']).['agg_col1', 'agg_col2'].sum()
    
    # 2개 columns 그루핑, 2개 columns 두 가지 집계
    mydf.groupby(['col1', 'col2']).['agg_col1', 'agg_col2'].agg(['sum', 'mean'])
    
    # 2개 columns 그룹, 2개 columns, 다양한 집계
    agg_dict = {'agg_col1':['sum', 'mean', 'size'],
                'agg_col2':['sum', 'var']}
    mydf.groupby(['col1', 'col2']).agg(agg_dict)

    03. agg 함수 customizing

    사용자 정의 agg 함수 활용법을 이해합니다.

    # Input: Series, Output: scalar 인 함수를 정의
    def my_agg_func_ex(s):
        return s.max()
    # 집계 Column명 수정 가능
    my_agg_func_ex.__name__ = 'My Aggregation Function'
    # 사용자 정의 함수를 agg에 활용
    mydf.groupby('mycolumn').['agg_col'].agg(my_agg_func_ex)

    함수에 추가 인수를 활용하는 것도 가능합니다.
    하지만, 여러 개의 함수를 활용할 때는 '클로저'를 활용해야 합니다.

     # 추가 인수를 받도록 정의
    def my_agg_func_ex(s, p1, p2):
        return s.between(p1, p2).max()
    # 집계 Column명 수정 가능
    my_agg_func_ex.__name__ = 'My Aggregation Function'
    # 사용자 정의 함수를 agg에 활용하며 동시에 인수 전달
    mydf.groupby('mycolumn').['agg_col'].agg(my_agg_func_ex, 10, 200)

    04. group filtering

    데이터셋을 Grouping 한 상태로 filtering이 가능합니다.
    일반적인 SQL query에서는 단일 쿼리로 group by 상태에서 filtering이 불가능합니다.

    # Input: DataFrame, Output: A Boolean
    def my_filtering_func_ex(df, threshold):
        return result>threshold
    
    # filter 적용: Retrun이 True인 Group만 선택 & 나머지 drop
    filtered = mydf.groupby('mycol').filter(my_filtering_func_ex, threshold=.5)

    05. 만능 함수 Apply

    groupby 객체에는 agg, filter, transform, apply 네 가지 함수를 적용할 수 있으며, 각각 함수는 Input & Output 양식이 상이합니다.

    1. agg(Series -> Scalar)
    2. filter(DataFrame -> Scalar)
    3. transform(DataFrame -> DataFrame)
    4. apply(DataFrame -> 모든양식)

    모든 종류의 Gropby 객체 처리가 가능하다는 점에서 apply() 함수의 유연성이 가장 높습니다.

    # 사용자함수1: Scalar 반환
    def my_apply_func_ex1(df):
        return result_scalar
    
    # 사용자함수2: Series 반환
    def my_apply_func_ex2(df):
        return result_series
    
    # groupby 객체에 반영(모두 가능)
    mydf.groupby('mycol').apply(my_apply_func_ex1)
    mydf.groupby('mycol').apply(my_apply_func_ex2)

    06. Pandas cut 함수

    연속형 변수를 범주화 하는 경우도 빈번하게 일어나므로 사용법을 익혀봅니다.

     # 범주형 Series로 변환
     bins = [-np.inf, 100, 200, 300, 400, 500, np.inf]
     labels=['Label1','Label2','Label3','Label4','Label5','Label6']
     cuts = pd.cut(mydf['mycol'], bins=bins, labels=labels)
    
     # 해당 범주를 그룹으로 활용
     mydf.groupby(cuts)

    07. pivot_table 함수

    groupby와 같이 집계를 쉽계하는 pivot_table 함수에 대해 알아봅니다.

    mydf.pivot_table(index='col1',   # axis 0
                     columns='col2', # axis 1
                     values='col3',  # 집계값
                     aggfunc=np.sum, # 집계방법
                     fill_value=0).round(2) # null인경우

    '데이터분석' 카테고리의 다른 글

    sklearn, pandas, numpy를 활용한 데이터 전처리  (0) 2019.10.14
    sklearn basic 01  (0) 2019.10.10
    pandas 테이블 양식 수정하기  (0) 2019.10.10
    pandas basic 03  (0) 2019.10.10
    pandas basic 02  (0) 2019.10.10

    댓글

Designed by Tistory.