ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter 11-3~11-4 데이터 필터링, 그룹 오브젝트
    Do it! 판다스 입문 2022. 6. 25. 18:59

    만약 그룹화한 데이터에서 원하는 데이터를 걸러내고 싶다면 어떻게 해야 할까요? 그럴 때는 데이터 필터링을 사용하면 됩니다. 데이터 필터링을 사용하면 기준에 맞는 데이터를 걸러낼 수 있습니다. 다음 예제를 통해 데이터 필터링이 무엇인지 알아보겠습니다.

     

     

    데이터 필터링 사용하기 - filter 메서드

    1. 다음과 같이 tips 데이터 집합을 불러와 데이터 크기를 확인합니다.

    tips = sns.load_dataset('tips')
    print(tips.shape)

    (244, 7)

     

    2. size 열의 데이터 수를 확인해 보면 1, 5, 6 테이블의 주문이 매우 적다는 것을 알 수 있습니다.

    print(tips['size'].value_counts( ))

    2      156
    3        38
    4        37
    5         5
    6         4
    1         4
    Name: size, dtype: int64

     

    3. 상황에 따라 이런 데이터는 제외하기도 합니다. 만약 30번 이상의 주문이 있는 테이블만 추려 데이터 분석을 하려면 어떻게 해야 할까요? 다음은 30번 이상의 주문이 있는 테이블만 그룹화하여 변수 tips_filtered에 저장한 것입니다.

    tips_filtered = tips.\
        groupby('size').\
        filter(lambda x: x['size'].count( ) >= 30)

     

    4. 과정 3을 거치고 나면 1, 5, 6 테이블의 데이터가 제외되었다는 것을 알 수 있습니다.

    print(tips_filtered.shape)

    (231, 7)

    print(tips_filtered['size'].value_counts( ))

    2      156
    3        38
    4        37
    Name: size, dtype: int64

     

     

     

     

     

     

    그룹 오브젝트 살펴보기

    지금까지는 groupby 메서드에 바로 집계 메서드를 사용하여 결과를 확인했습니다. 즉, groupby 메서드가 반환하는 값인 그룹 오브젝트에 대해서는 언급하지 않았습니다. 이번에는 groupby 메서드의 결괏값인 그룹 오브젝트를 자세히 살펴보겠습니다.

     

     

    그룹 오브젝트 저장하여 살펴보기

    1. 다음은 tips 데이터 집합에서 임의로 10개의 데이터를 추출한 것입니다.

    tips_10 = sns.load_dataset('tips').sample(10, random_state=42)
    print(tips_10)

          total_bill       tip          sex   smoker      day       time    size
    24      19.82    3.18        Male          No      Sat    Dinner        2
    6          8.77    2.00        Male          No      Sun   Dinner        2
    153      NaN    2.00        Male          No      Sun   Dineer        4
    211      NaN    5.16        Male         Yes      Sat    Dinner        4
    198      NaN    2.00    Female         Yes    Thur    Lunch        2
    176      NaN    2.00        Male         Yes     Sun    Dinner        2
    192    28.44    2.56        Male         Yes    Thur    Lunch         2
    124    12.48    2.52    Female          No    Thur    Lunch         2
    9        14.78    3.23        Male          No     Sun    Dinner        2
    101    15.38    3.00    Female         Yes       Fri    Dinner        2

     

    2. groupby 메서드의 결괏값을 출력하면 자료형이 그룹 오브젝트라는 것을 확인할 수 있습니다.

    grouped = tips_10.groupby('sex')
    print(grouped)

    <pandas.core.groupby.DataFrameGroupBy object at 0x11286e128>

     

    3. 그룹 오브젝트에 포함된 그룹을 보려면 groups 속성을 출력하면 됩니다. 그러면 sex 열로 그룹화한 데이터프레임의 인덱스를 확인할 수 있습니다. 이 그룹 오브젝트로 집계, 변환, 필터 작업을 수행하면 되는 것이죠.

    print(grouped.groups)

    {'Male': Int64Index([24, 6, 153, 211, 176, 192, 9], dtype='int64'), 'Female': Int64Index([198, 124, 101], dtype='int64')}

     

     

     

     

     

    한 번에 그룹 오브젝트 계산하기

    바로 앞의 실습에서 구한 그룹 오브젝트(grouped)는 smoker, day, time 열과 같은 평균값을 구할 수 없는 열도 포함하고 있습니다. 이런 그룹 오브젝트에 mean 메서드와 같은 집계 메서드를 사용하면 어떻게 될까요? 오류가 발생할까요? 아닙니다! 다행히 파이썬은 자동으로 계산할 수 있는 열을 골라주는 기능을 제공합니다. 따라서 그룹 오브젝트에 mean 메서드를 사용해도 바로 평균값을 구할 수 있습니다.

     

     

    그룹 오브젝트의 평균 구하기

    1. 일단 앞에서 만든 그룹 오브젝트(grouped)를 이용하여 평균을 구해 보겠습니다. 그러면 tips 데이터 집합의 모든 열의 평균을 구한 것이 아니라 total_bill, tip size 열의 평균을 구했다는 것을 알 수 있습니다.

    avgs = grouped.mean( )
    print(avgs)

                    total_bill                tip             size
    sex
    Male             20.02    2.875714    2.571429
    Female         13.62    2.506667    2.000000

     

    2. tips 데이터 집합의 열을 확인해 보면 평균값을 계산할 수 없는 열인 smoker, day, time 열은 그룹 연산에서 제외되었다는 것을 알 수 있습니다. 이처럼 파이썬은 그룹 연산에 적합한 열을 알아서 골라줍니다.

    print(tips_10.columns)

    Index(['total_bill', 'tip', 'sex', 'smoker', 'day', 'time', 'size'],
    dtype='object)

     

     

     

     

     

    그룹 오브젝트 활용하기

    이번에는 그룹 오브젝트를 좀 더 다양하게 활용하는 방법에 대해 알아보겠습니다. 그룹 오브젝트를 활용하는 방법은 아주 많습니다. 여기에서 실습을 통해 소개할 내용은 그룹 오브젝트에서 '데이터 추출하기'와 '반복문 사용하기'입니다. 만약 그룹 오브젝트를 활용하는 방법을 더 알고 싶다면 다음 웹 사이트를 참고하세요.

    https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html 

     

     

     

    그룹 오브젝트에서 데이터 추출하고 반복하기

    1. 만약 그룹 오브젝트에서 특정 데이터만 추출하려면 get_group 메서드를 사용하면 됩니다. 다음은 sex 열로 그룹화한 그룹 오브젝트에 get_group 메서드를 사용하여 성별이 여성인 데이터만 추출한 것입니다.

    female = grouped.get_group('Female')
    print(female)

              total_bill       tip          sex   smoker      day       time    size
    198        13.00    2.00    Female         Yes    Thur     Lunch       2
    124        12.48    2.52    Female          No    Thur     Lunch       2
    101        15.38    3.00    Female         Yes       Fri    Dinner       2

     

    2. 이번에는 그룹 오브젝트를 반복문에 사용해 보겠습니다. sex 열을 기준으로 그룹화한 tips 데이터 집합은 여성 그룹과 남성 그룹으로 나누어져 있습니다. 이 특징을 이용하여 반복문을 사용하면 됩니다. 다음은 각 성별 그룹의 데이터를 반복문을 이용하여 출력한 것입니다.

    for sex_group in grouped:
        print(sex_group)

    ('Male',         total_bill      tip          sex    smoker    day        time    size
    24                    19.82    3.18       Male           No     Sat    Dinner        2
    6                        8.77    2.00       Male           No    Sun    Dinner        2
    153                  24.55    2.00       Male           No    Sun    Dinner        4
    ...
    9                      14.78    3.23       Male           No    Sun    Dinner        2)

    ('Female',     total_bill       tip         sex    smoker      day      time    size
    198                  13.00    2.00   Female          Yes    Thur    Lunch        2
    124                  12.48    2.52   Female           No    Thur    Lunch        2
    101                  15.38    3.00   Female          Yes       Fri    Dinner       2)

     

    3. 그런데 과정 2의 결과를 자세히 살펴보면 sex_group으로 넘어온 값이 튜플이라는 것을 알 수 있습니다. 다음은 sex_group의 자세한 정보를 출력한 것입니다.

    for sex_group in grouped:
        print('the type is: {}\n'.format(type(sex_group)))
        print('the length is : {}\n'.format(len(sex_group)))
        
        first_element = sex_group[0]
        print('the first element is: {}\n'.format(first_element))
        print('it has a type of: {}\n'.format(type(sex_group[0])))
        
        second_element = sex_group[1]
        print('the second element is:\n'.format(second_element))
        print('it has a type of: {}\m'.format(type(second_element)))
        
        print('what we have:')
        print(sex_group)
        
        break

    the type is: <class 'tuple'>

    the length is: 2

    the first element is: Male

    it has a type of: <class 'str'>

    the second element is:
             total_bill       tip      sex   smoker      day       time    size
    24         19.82    3.18    Male          No      Sat    Dinner        2
    6             8.77    2.00    Male          No      Sun   Dinner        2
    153       24.55    2.00    Male          No      Sun   Dineer        4
    211       25.89    5.16    Male         Yes      Sat    Dinner        4
    176       17.89    2.00    Male         Yes     Sun    Dinner        2
    192       28.44    2.56    Male         Yes    Thur    Lunch         2
    9           14.78    3.23    Male          No     Sun    Dinner        2

    it has a type of: <class 'pandas.core.frame.DataFrame'>

    what we have:
    ('Male',         total_bill      tip          sex    smoker    day        time    size
    24                    19.82    3.18       Male           No     Sat    Dinner        2
    6                        8.77    2.00       Male           No    Sun    Dinner        2
    153                  24.55    2.00       Male           No    Sun    Dinner        4
    211                  25.89    5.16       Male          Yes    Sat     Dinner        4
    176                  17.89    2.00       Male          Yes    Sun    Dinner        2
    192                  28.44    2.56       Male          Yes   Thur     Lunch        2
    9                      14.78    3.23       Male           No    Sun    Dinner        2)

     

     

     

     

     

    여러 열을 사용해 그룹 오브젝트 만들고 계산하기

    지금까지는 하나의 열을 사용하여 그룹 오브젝트를 만들고 연산을 수행했습니다. 하지만 여러 열을 사용하여 그룹 오브젝트를 만들고 평균값을 구하는 등의 계산도 할 수 있습니다.

     

     

    그룹 오브젝트 계산하고 살펴보기

    1. 여러 열을 사용하여 데이터를 그룹화하려면 리스트에 열 이름을 담아 groupby 메서드에 전달하면 됩니다. 다음은 sex, time 열을 기준으로 데이터를 그룹화하고 평균값을 구한 것입니다.

    bill_sex_time = tips_10.groupby(['sex', 'time'])
    group_avg = bill_sex_time.mean( )

    print(group_avg)

                                       total_bill               tip            size
    sex            time
    Male        Lunch      28.440000    2.560000    2.000000
                   Dinner      18.616667    2.928333    2.666667
    Female    Lunch      12.740000    2.260000    2.000000
                   Dinner      15.380000    3.000000    2.000000

     

    2. 과정 1을 거친 group_avg의 자료형을 확인해 보면 데이터프레임이라는 것을 알 수 있습니다. 그리고 변수 group_avg에 포함된 열은 total_bill, tip, size라는 것도 알 수 있습니다.

    print(type(group_avg))

    <class 'pandas.core.frame.DataFrame'>

    print(group_avg.columns)

    Index(['total_bill', 'tip', 'size'], dtype='object')

     

    3. group_avg의 자료형은 데이터프레임이라고 했습니다. 그러면 인덱스는 어떻게 구성되어 있을까요? 다음은 group_avg의 인덱스를 출력한 것입니다.

    print(group_avg.index)

    MultiIndex(levels=[['Male', 'Female'], ['Lunch', 'Dinner']],
                      labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
                      names=['sex', 'time'])

     

    4. 과정 3과 같이 데이터프레임의 인덱스가 MultiIndex인 경우에는 reset_index 메서드를 사용하여 데이터프레임의 인덱스를 새로 부여할 수도 있습니다.

    group_method = tips_10.groupby(['sex', 'time']).mean( ).reset_index( )
    print(group_method)

                sex        time         total_bill               tip            size
    0        Male     Lunch     28.440000    2.560000    2.000000
    1        Male    Dinner     18.616667    2.928333    2.666667
    2    Female     Lunch     12.740000    2.260000    2.000000
    3    Female    Dinner     15.380000    3.000000    2.000000

     

    5. reset_index 메서드 대신 as_index 인자를 False로 설정해도 과정 4와 같은 결과를 얻을 수 있습니다.

    group_param = tips_10.groupby(['sex', 'time'], as_index=False).mean( )
    print(group_param)

                sex        time         total_bill               tip            size
    0        Male     Lunch     28.440000    2.560000    2.000000
    1        Male    Dinner     18.616667    2.928333    2.666667
    2    Female     Lunch     12.740000    2.260000    2.000000
    3    Female    Dinner     15.380000    3.000000    2.000000

     

     

     

     

     

    마무리하며

    이 장에서는 groupby 메서드의 분리-반영-결합 과정을 구체적으로 살펴보고 데이터를 집계, 변환, 필터링하는 방법을 알아보았습니다. 또 여러 가지 방법으로 그룹 오브젝트를 만들고 계산하는 방법도 알아보았습니다. 데이터를 그룹화하여 계산하는 작업은 실무에서 자주 사용하므로 반드시 알아두어야 합니다.

     

     

     

     

     

    출처 : "판다스 입문"

Designed by Tistory.