[Pandas] 데이터 범주로 나누기(pd.cut(),pd.qcut())

반응형
    반응형

    데이터 프레임의 데이터를 많이 다루는데 범주를 만들어야 하는 경우가 있습니다. 

    범주를 나누는 방법을 알려드립니다.

     

    데이터

    랜덤으로 만든 int와 float를 각각 컬럼으로 하고 데이터프레임을 예제로 하겠습니다.

    import pandas as pd
    import numpy as np
    import random
    df = pd.DataFrame({'int':random.sample(range(100),30),'float':np.random.randn(30)})
    df

     

    1. 동일길이로 나누기

    데이터를 동일길이로 나눌려면 pd.cut()을 사용합니다. pd.cut()은 시리즈를 input값으로 해야합니다.

    파라미터는 다음과 같습니다.

    pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', ordered=True)



    파라미터 데이터타입 설명
    x array-like 동일길이로 나눌 array. 반드시 1-dimension이어야 한다.
    bins int, sequence of scalars, or IntervalIndex 범주를 정한다.
    right  bool default True
    True이면 오른쪽 끝을 포함
    False면 오른쪽 끝을 포함하지 않음.
    labels array or False default None 임의로 레이블 지정.
    False면 빈의 정수표시자만 반환.
    order=False면 레이블을 제공해주어야 한다.
    retbins  bool default False, bins을 반환할지 여부. bins이 스칼라일떼 유용.
    precision int default 3
    범주가 표시될 소숫점 자릿수 ,
    3이면 소수점 3째자리까지 반올림
    include_lowest bool default False, 첫번째 인터벌이 왼쪽을 포함할 것인지 여부
    duplicates  {‘raise’, ‘drop’} default raise
    가장자리가 고유하지 않은 경우, ValueError를 일으킬지 삭제할지 여부
    ordered  bool  default True
    라벨 순서 여부. True이면 정렬됨.

     

    데이터를 6가지 범주로 나눠보겠습니다. 이에 맞게 알아서 길이를 정해줍니다.

    cutting_int = pd.cut(df.int,6)
    cutting_int.tail()

    범주를 어떻게 했는지 맨 밑에 보여줍니다.

     

    groupby 활용

    범주를 만들었으니 범주별로 어떤 통계값을 갖는지 groupby를 통해 확인할 수 있습니다.

    group_int = df.int.groupby(cutting_int)
    group_int.agg(['count','mean','std','min','max'])

     

    2. 동일 개수로 나누기

    이번엔 범주 개수가 아니라 데이터 갯수를 동일하게 만드는 방법입니다. pd.qcut()을 사용합니다.

    파라미터는 다음과 같습니다.

    pandas.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')

     

    파라미터 데이터타입 설명
    x 1d ndarray or Series 범주를 나눌 시리즈 또는 1d ndarray
    q int or list-like of float 범주를 나눌 갯수
    labels  array or False default None, 임의로 지정
    labels 지정할시 따로 정해주어야 한다.
    대신 q와 동일한 갯수어야 한다.
    retbins bool optional, (bins,labels)로 반환할지 여부. bin이 스칼라로 제공되는 경우 유용.
    precision  int optional, bins가 표시될 소수점 자리, 디폴트 3
    duplicates {‘raise’, ‘drop’} default raise
    bin 가장자리가 고유하지 않은 경우, ValueError를 발생시키거나 고유하지 않은 값을 삭제.

     

    라벨 지정해 범주화를 해보겠습니다.

    dive_float = pd.qcut(df.float,5,labels=['Bad','Notbad','Medium','Good','Best'])
    dive_float.tail()

     

    groupby 활용

    범주별로 통계를 만들어보겠습니다.

    grouped = df.float.groupby(dive_float)
    grouped.apply(summary).unstack()

    count가 모두 동일하게 6으로 된 것을 볼 수 있습니다.

     

     

    관련 포스팅

    [Pandas] 같은 범주로 묶기(groupby)

    [Pandas] 함수 적용하기(map,apply, applymap)

    댓글

    Designed by JB FACTORY

    ....