14. 그룹화
동일한 값을 가진 것들끼리 합쳐서 통계 또는 평균 등의 값을 계산하기 위해 사용
import pandas as pd
df = pd.read_excel('score.xlsx', index_col='지원번호')
df
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
SW특기 |
지원번호 |
|
|
|
|
|
|
|
|
|
1번 |
채치수 |
북산고 |
197 |
90 |
85 |
100 |
95 |
85 |
Python |
2번 |
정대만 |
북산고 |
184 |
40 |
35 |
50 |
55 |
25 |
Java |
3번 |
송태섭 |
북산고 |
168 |
80 |
75 |
70 |
80 |
75 |
Javascript |
4번 |
서태웅 |
북산고 |
187 |
40 |
60 |
70 |
75 |
80 |
NaN |
5번 |
강백호 |
북산고 |
188 |
15 |
20 |
10 |
35 |
10 |
NaN |
6번 |
변덕규 |
능남고 |
202 |
80 |
100 |
95 |
85 |
80 |
C |
7번 |
황태산 |
능남고 |
188 |
55 |
65 |
45 |
40 |
35 |
PYTHON |
8번 |
윤대협 |
능남고 |
190 |
100 |
85 |
90 |
95 |
95 |
C# |
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
SW특기 |
지원번호 |
|
|
|
|
|
|
|
|
|
1번 |
채치수 |
북산고 |
197 |
90 |
85 |
100 |
95 |
85 |
Python |
2번 |
정대만 |
북산고 |
184 |
40 |
35 |
50 |
55 |
25 |
Java |
3번 |
송태섭 |
북산고 |
168 |
80 |
75 |
70 |
80 |
75 |
Javascript |
4번 |
서태웅 |
북산고 |
187 |
40 |
60 |
70 |
75 |
80 |
NaN |
5번 |
강백호 |
북산고 |
188 |
15 |
20 |
10 |
35 |
10 |
NaN |
6번 |
변덕규 |
능남고 |
202 |
80 |
100 |
95 |
85 |
80 |
C |
7번 |
황태산 |
능남고 |
188 |
55 |
65 |
45 |
40 |
35 |
PYTHON |
8번 |
윤대협 |
능남고 |
190 |
100 |
85 |
90 |
95 |
95 |
C# |
df.groupby('학교').get_group('북산고')
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
SW특기 |
지원번호 |
|
|
|
|
|
|
|
|
|
1번 |
채치수 |
북산고 |
197 |
90 |
85 |
100 |
95 |
85 |
Python |
2번 |
정대만 |
북산고 |
184 |
40 |
35 |
50 |
55 |
25 |
Java |
3번 |
송태섭 |
북산고 |
168 |
80 |
75 |
70 |
80 |
75 |
Javascript |
4번 |
서태웅 |
북산고 |
187 |
40 |
60 |
70 |
75 |
80 |
NaN |
5번 |
강백호 |
북산고 |
188 |
15 |
20 |
10 |
35 |
10 |
NaN |
df.groupby('학교').get_group('능남고')
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
SW특기 |
지원번호 |
|
|
|
|
|
|
|
|
|
6번 |
변덕규 |
능남고 |
202 |
80 |
100 |
95 |
85 |
80 |
C |
7번 |
황태산 |
능남고 |
188 |
55 |
65 |
45 |
40 |
35 |
PYTHON |
8번 |
윤대협 |
능남고 |
190 |
100 |
85 |
90 |
95 |
95 |
C# |
df.groupby('학교').mean() # 계산 가능한 데이터들의 평균값
|
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
학교 |
|
|
|
|
|
|
능남고 |
193.333333 |
78.333333 |
83.333333 |
76.666667 |
73.333333 |
70.0 |
북산고 |
184.800000 |
53.000000 |
55.000000 |
60.000000 |
68.000000 |
55.0 |
df.groupby('학교').size() # 각 그룹의 크기
학교
능남고 3
북산고 5
dtype: int64
df.groupby('학교').size()['능남고'] # 학교로 그룹화를 한 뒤에 능남고에 해당하는 데이터의 수
3
df.groupby('학교')['키'].mean() # 학교로 그룹화를 한 뒤에 키의 평균 데이터
학교
능남고 193.333333
북산고 184.800000
Name: 키, dtype: float64
df.groupby('학교')[['국어','영어','수학']].mean() # 학교로 그룹화를 한 뒤에 국어,영어,수학 평균 데이터
|
국어 |
영어 |
수학 |
학교 |
|
|
|
능남고 |
78.333333 |
83.333333 |
76.666667 |
북산고 |
53.000000 |
55.000000 |
60.000000 |
df['학년'] = [3, 3, 2, 1, 1, 3, 2, 2] # 학년 Column 추가
df
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
SW특기 |
학년 |
지원번호 |
|
|
|
|
|
|
|
|
|
|
1번 |
채치수 |
북산고 |
197 |
90 |
85 |
100 |
95 |
85 |
Python |
3 |
2번 |
정대만 |
북산고 |
184 |
40 |
35 |
50 |
55 |
25 |
Java |
3 |
3번 |
송태섭 |
북산고 |
168 |
80 |
75 |
70 |
80 |
75 |
Javascript |
2 |
4번 |
서태웅 |
북산고 |
187 |
40 |
60 |
70 |
75 |
80 |
NaN |
1 |
5번 |
강백호 |
북산고 |
188 |
15 |
20 |
10 |
35 |
10 |
NaN |
1 |
6번 |
변덕규 |
능남고 |
202 |
80 |
100 |
95 |
85 |
80 |
C |
3 |
7번 |
황태산 |
능남고 |
188 |
55 |
65 |
45 |
40 |
35 |
PYTHON |
2 |
8번 |
윤대협 |
능남고 |
190 |
100 |
85 |
90 |
95 |
95 |
C# |
2 |
df.groupby(['학교','학년']).mean() # 학교별, 학년별 평균 데이터
|
|
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
학교 |
학년 |
|
|
|
|
|
|
능남고 |
2 |
189.0 |
77.5 |
75.0 |
67.5 |
67.5 |
65.0 |
3 |
202.0 |
80.0 |
100.0 |
95.0 |
85.0 |
80.0 |
북산고 |
1 |
187.5 |
27.5 |
40.0 |
40.0 |
55.0 |
45.0 |
2 |
168.0 |
80.0 |
75.0 |
70.0 |
80.0 |
75.0 |
3 |
190.5 |
65.0 |
60.0 |
75.0 |
75.0 |
55.0 |
df.groupby('학년').mean() # 학년별 평균 데이터
|
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
학년 |
|
|
|
|
|
|
1 |
187.500000 |
27.500000 |
40.000000 |
40.000000 |
55.000000 |
45.000000 |
2 |
182.000000 |
78.333333 |
75.000000 |
68.333333 |
71.666667 |
68.333333 |
3 |
194.333333 |
70.000000 |
73.333333 |
81.666667 |
78.333333 |
63.333333 |
df.groupby('학년').mean().sort_values('키',ascending=False)
|
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
학년 |
|
|
|
|
|
|
3 |
194.333333 |
70.000000 |
73.333333 |
81.666667 |
78.333333 |
63.333333 |
1 |
187.500000 |
27.500000 |
40.000000 |
40.000000 |
55.000000 |
45.000000 |
2 |
182.000000 |
78.333333 |
75.000000 |
68.333333 |
71.666667 |
68.333333 |
df.groupby(['학교','학년']).sum()
|
|
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
학교 |
학년 |
|
|
|
|
|
|
능남고 |
2 |
378 |
155 |
150 |
135 |
135 |
130 |
3 |
202 |
80 |
100 |
95 |
85 |
80 |
북산고 |
1 |
375 |
55 |
80 |
80 |
110 |
90 |
2 |
168 |
80 |
75 |
70 |
80 |
75 |
3 |
381 |
130 |
120 |
150 |
150 |
110 |
df.groupby('학교')[['이름','SW특기']].count() # 학교로 그룹화를 한 뒤에 각 학교별 SW특기 데이터의 수를 가져옴
|
이름 |
SW특기 |
학교 |
|
|
능남고 |
3 |
3 |
북산고 |
5 |
3 |
school = df.groupby('학교')
school['학년'].value_counts() # 학교로 그룹화를 한 뒤에 학년별 학생 수를 가져옴.
학교 학년
능남고 2 2
3 1
북산고 1 2
3 2
2 1
Name: 학년, dtype: int64
school['학년'].value_counts().loc['북산고'] # 학교로 그룹화를 한 뒤에 북산고에 대해서 학년별 학생 수를 가져옴.
학년
1 2
3 2
2 1
Name: 학년, dtype: int64
school['학년'].value_counts().loc['능남고'] # 학교로 그룹화를 한 뒤에 능남고에 대해서 학년별 학생 수를 가져옴
학년
2 2
3 1
Name: 학년, dtype: int64
school['학년'].value_counts(normalize=True).loc['북산고'] # 학생들의 수 데이터를 퍼센트로 비교하여 가져옴
학년
1 0.4
3 0.4
2 0.2
Name: 학년, dtype: float64
댓글남기기