20. 데이터프레임의 응용 - 그룹 연산

김동웅·2021년 9월 28일
0

Pandas with python

목록 보기
20/23

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

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


- 한 개의 열을 기준으로 그룹화

그룹 연산(분할) : 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'열을 제외하고 숫자형 데이터를 가진 열에 대해서 연산을 수행한다.

1등석의 평균나이가 가장 많고 생존율도 가장 높다는 정보를 얻을 수 있다.
         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

0개의 댓글