복잡한 데이터를 어떤 기준에 따라 여러 그룹으로 나눠서 관찰하는 것도 좋은 방법이다. 이처럼 특정 기준을 적용하여 몇 개의 그룹으로 분할하여 처리하는 것을 그룹 연산이라고 한다.
특히 그룹 연산은 데이터를 집계, 변환, 필터링하는데 효율적이다. 3단계의 과정으로 이루어진다.
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
...
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