복잡한 데이터를 어떤 기준에 따라 여러 그룹으로 나눠서 관찰하는 것도 좋은 방법이다.
이처럼 특정 기준을 적용하여 몇 개의 그룹으로 분할하여 처리하는것을 그룹 연산이라고한다.
그룹 연산(분할) : DataFrame 객체.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())
print('\n')
grouped = df.groupby(['class'])
print(grouped)
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 0x000001BA2C99AEB0>
'class' 열에는 'First','Second','Third'라는 3개의 값이 들어있다.
이 3개의 값을 기준으로 891명의 승객 데이터가 3개의 그룹으로 나누어진다.
반복문을 이용하여 그룹 객체의 내용을 출력해보자
for key, group in grouped:
print('* key :',key)
print('* number : ',len(group))
print(group.head())
print('\n')
* 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 11 58.0 female First 26.5500 1 23 28.0 male First 35.5000 1
* 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 20 35.0 male Second 26.0000 0 21 34.0 male Second 13.0000 1
* key : Third * number : 491 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
그룹 객체에 연산메소드를 적용할 수 있다.
average = grouped.mean()
print(average)
문자열 데이터를 갖는 'sex','class'열을 제외하고 숫자형 데이터를 가진 열에 대해서 연산을 수행한다.
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
그룹 연산(분할) : DataFrame 객체.groupby(기준이 되는열의 리스트)
import pandas as pd
import seaborn as sns
titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age','sex','class','fare','survived']]
grouped_two = df.groupby(['class','sex'])
'class' 열에는 'First','Second','Third'라는 3개의 값이 들어있고,
'sex' 열에는 'female','male'라는 2개의 값이 들어있다.
이 3*2 개의 값을 기준으로 891명의 승객 데이터가 6개의 그룹으로 나누어진다.
반복문을 이용하여 그룹 객체의 내용을 출력해보자
for key, group in grouped_two :
print('* key : ',key)
print('* number : ',len(group))
print(group.head())
print('\n')
* key : ('First', 'female') * number : 94 age sex class fare survived 1 38.0 female First 71.2833 1 3 35.0 female First 53.1000 1 11 58.0 female First 26.5500 1 31 NaN female First 146.5208 1 52 49.0 female First 76.7292 1 * key : ('First', 'male') * number : 122 age sex class fare survived 6 54.0 male First 51.8625 0 23 28.0 male First 35.5000 1 27 19.0 male First 263.0000 0 30 40.0 male First 27.7208 0 34 28.0 male First 82.1708 0 * key : ('Second', 'female') * number : 76 age sex class fare survived 9 14.0 female Second 30.0708 1 15 55.0 female Second 16.0000 1 41 27.0 female Second 21.0000 0 43 3.0 female Second 41.5792 1 53 29.0 female Second 26.0000 1 * key : ('Second', 'male') * number : 108 age sex class fare survived 17 NaN male Second 13.0 1 20 35.0 male Second 26.0 0 21 34.0 male Second 13.0 1 33 66.0 male Second 10.5 0 70 32.0 male Second 10.5 0 * key : ('Third', 'female') * number : 144 age sex class fare survived 2 26.0 female Third 7.9250 1 8 27.0 female Third 11.1333 1 10 4.0 female Third 16.7000 1 14 14.0 female Third 7.8542 0 18 31.0 female Third 18.0000 0 * key : ('Third', 'male') * number : 347 age sex class fare survived 0 22.0 male Third 7.2500 0 4 35.0 male Third 8.0500 0 5 NaN male Third 8.4583 0 7 2.0 male Third 21.0750 0 12 20.0 male Third 8.0500 0
average2 = grouped_two.mean()
print(average2)
print('\n')
print(type(average2))
age fare survived class sex First female 34.611765 106.125798 0.968085 male 41.281386 67.226127 0.368852 Second female 28.722973 21.970121 0.921053 male 30.740707 19.741782 0.157407 Third female 21.750000 16.118810 0.500000 male 26.507589 12.661633 0.135447 <class 'pandas.core.frame.DataFrame'>
마찬가지로 여러개의 열을 기준으로 그룹화한 그룹객체에서도 특정 그룹을 추출할 수 있다.
group3f = grouped_two.get_group(('Third','female'))
print(group3f.head())
age sex class fare survived 2 26.0 female Third 7.9250 1 8 27.0 female Third 11.1333 1 10 4.0 female Third 16.7000 1 14 14.0 female Third 7.8542 0 18 31.0 female Third 18.0000 0