복잡한 데이터를 어떤 기준에 따라 여러 그룹으로 나눠서 관찰하는 것도 좋은 방법이다. 이처럼 특정 기준을 적용하여 몇 개의 그룹으로 분할하여 처리하는 것을 그룹 연산이라고 한다.

특히 그룹 연산은 데이터를 집계, 변환, 필터링하는데 효율적이다. 3단계의 과정으로 이루어진다.

  1. 분할(split) : 데이터를 특정 조건에 의해 분할
  2. 적용(apply) : 데이터를 집계, 변환, 필터링하는데 필요한 메서드 적용
  3. 결합(combine) : 2단계의 처리 결과를 하나로 결합

그룹 객체 만들기 (분할 단계)

1개 열을 기준으로 그룹화

groupby(기준이 되는 열) 메서드를 사용한다.

import pandas as pd
import seaborn as sns

titanic = sns.load_dataset('titanic')
df = titanic.loc[:, ['age', 'sex', 'class', 'fare', 'survived']]

print('승객 수 : ', len(df))
print(df.head())

# class열을 기준으로 그룹화
#   class열은 First, Second, Third 3개의 값이 들어있다.
#   따라서 3개의 그룹으로 나누어진다.

grouped = df.groupby(['class'])
print(grouped)
print()
print()

for key, group in grouped:
    print(' * key :', key)
    print(' * number :', len(group))
    print(group.head(3))
    print()
승객 수 :  891
    age     sex  class     fare  survived
0  22.0    male  Third   7.2500         0
1  38.0  female  First  71.2833         1
2  26.0  female  Third   7.9250         1
3  35.0  female  First  53.1000         1
4  35.0    male  Third   8.0500         0
<pandas.core.groupby.generic.DataFrameGroupBy object at 
0x0000028C6CF4CDC8>

 * key : First
 * number : 216
    age     sex  class     fare  survived
1  38.0  female  First  71.2833         1
3  35.0  female  First  53.1000         1
6  54.0    male  First  51.8625         0

 * key : Second
 * number : 184
     age     sex   class     fare  survived
9   14.0  female  Second  30.0708         1
15  55.0  female  Second  16.0000         1
17   NaN    male  Second  13.0000         1

 * key : Third
 * number : 491
    age     sex  class   fare  survived
0  22.0    male  Third  7.250         0
2  26.0  female  Third  7.925         1
4  35.0    male  Third  8.050         0

연산 메서드

위와 같이 생성한 grouped객체에 연산 메서드를 적용할 수 있다.

...
average = grouped.mean()
print(type(average))
print(average)
<class 'pandas.core.frame.DataFrame'>
              age       fare  survived
class
First   38.233441  84.154687  0.629630
Second  29.877630  20.662183  0.472826
Third   25.140620  13.675550  0.242363

get_group() : 특정 그룹 선택

...

group3 = grouped.get_group('Third')
print(group3.head())
    age     sex  class     fare  survived
0  22.0    male  Third   7.2500         0
2  26.0  female  Third   7.9250         1
4  35.0    male  Third   8.0500         0
5   NaN    male  Third   8.4583         0
7   2.0    male  Third  21.0750         0

여러 열을 기준으로 그룹화