데이터 분석 기초
15. 그룹화
세용용용용
2023. 3. 15. 23:36
15. 그룹화¶
동일한 값을 가진 것들끼리 합쳐서 통계 또는 평균 등의 계산하기 위해 사용
In [1]:
import pandas as pd
df = pd.read_csv('score.csv')
df
Out[1]:
| 이름 | 학교 | 키 | 국어 | 영어 | 수학 | 과학 | 사회 | SW특기 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 채치수 | 북산고 | 197 | 90 | 85 | 100 | 95 | 85 | Python |
| 1 | 정대만 | 북산고 | 184 | 40 | 35 | 50 | 55 | 25 | Java |
| 2 | 송태섭 | 북산고 | 168 | 80 | 75 | 70 | 80 | 75 | Javascript |
| 3 | 서태웅 | 북산고 | 187 | 40 | 60 | 70 | 75 | 80 | NaN |
| 4 | 강백호 | 북산고 | 188 | 15 | 20 | 10 | 35 | 10 | NaN |
| 5 | 변덕규 | 능남고 | 202 | 80 | 100 | 95 | 85 | 80 | C |
| 6 | 황태산 | 능남고 | 188 | 55 | 65 | 45 | 40 | 35 | PYTHON |
| 7 | 윤대협 | 능남고 | 190 | 100 | 85 | 90 | 95 | 95 | C# |
In [ ]:
df.groupby('학교')
In [2]:
df.groupby('학교').get_group('북산고')
Out[2]:
| 이름 | 학교 | 키 | 국어 | 영어 | 수학 | 과학 | 사회 | SW특기 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 채치수 | 북산고 | 197 | 90 | 85 | 100 | 95 | 85 | Python |
| 1 | 정대만 | 북산고 | 184 | 40 | 35 | 50 | 55 | 25 | Java |
| 2 | 송태섭 | 북산고 | 168 | 80 | 75 | 70 | 80 | 75 | Javascript |
| 3 | 서태웅 | 북산고 | 187 | 40 | 60 | 70 | 75 | 80 | NaN |
| 4 | 강백호 | 북산고 | 188 | 15 | 20 | 10 | 35 | 10 | NaN |
In [3]:
df.groupby('학교').get_group('능남고')
Out[3]:
| 이름 | 학교 | 키 | 국어 | 영어 | 수학 | 과학 | 사회 | SW특기 | |
|---|---|---|---|---|---|---|---|---|---|
| 5 | 변덕규 | 능남고 | 202 | 80 | 100 | 95 | 85 | 80 | C |
| 6 | 황태산 | 능남고 | 188 | 55 | 65 | 45 | 40 | 35 | PYTHON |
| 7 | 윤대협 | 능남고 | 190 | 100 | 85 | 90 | 95 | 95 | C# |
In [4]:
df.groupby('학교').mean() #계산 가능한 데이터들의 평균값
Out[4]:
| 키 | 국어 | 영어 | 수학 | 과학 | 사회 | |
|---|---|---|---|---|---|---|
| 학교 | ||||||
| 능남고 | 193.333333 | 78.333333 | 83.333333 | 76.666667 | 73.333333 | 70.0 |
| 북산고 | 184.800000 | 53.000000 | 55.000000 | 60.000000 | 68.000000 | 55.0 |
In [5]:
df.groupby('학교').size() #학교 별로 그룹핑된 것들이 몇개나 있는지 확인
Out[5]:
학교 능남고 3 북산고 5 dtype: int64
In [6]:
df.groupby('학교').size()['능남고'] #학교로 그룹화를 한 뒤에 능남고에 해당하는 데이터의 수
Out[6]:
3
In [9]:
df.groupby('학교')['키'].mean() #학교로 그룹화를 한 뒤에 키의 평균 데이터
Out[9]:
학교 능남고 193.333333 북산고 184.800000 Name: 키, dtype: float64
In [11]:
df.groupby('학교')[['국어','영어','수학']].mean() #학교로 그룹화를 한 뒤에 국,영,수 평균데이터 확인
Out[11]:
| 국어 | 영어 | 수학 | |
|---|---|---|---|
| 학교 | |||
| 능남고 | 78.333333 | 83.333333 | 76.666667 |
| 북산고 | 53.000000 | 55.000000 | 60.000000 |
In [12]:
df['학년'] = [3,3,2,1,1,3,2,2] #학년 컬럼을 추가
df
Out[12]:
| 이름 | 학교 | 키 | 국어 | 영어 | 수학 | 과학 | 사회 | SW특기 | 학년 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 채치수 | 북산고 | 197 | 90 | 85 | 100 | 95 | 85 | Python | 3 |
| 1 | 정대만 | 북산고 | 184 | 40 | 35 | 50 | 55 | 25 | Java | 3 |
| 2 | 송태섭 | 북산고 | 168 | 80 | 75 | 70 | 80 | 75 | Javascript | 2 |
| 3 | 서태웅 | 북산고 | 187 | 40 | 60 | 70 | 75 | 80 | NaN | 1 |
| 4 | 강백호 | 북산고 | 188 | 15 | 20 | 10 | 35 | 10 | NaN | 1 |
| 5 | 변덕규 | 능남고 | 202 | 80 | 100 | 95 | 85 | 80 | C | 3 |
| 6 | 황태산 | 능남고 | 188 | 55 | 65 | 45 | 40 | 35 | PYTHON | 2 |
| 7 | 윤대협 | 능남고 | 190 | 100 | 85 | 90 | 95 | 95 | C# | 2 |
In [13]:
df.groupby(['학교','학년']).mean()# 학교별 학년별 평균 데이터
Out[13]:
| 키 | 국어 | 영어 | 수학 | 과학 | 사회 | ||
|---|---|---|---|---|---|---|---|
| 학교 | 학년 | ||||||
| 능남고 | 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 |
In [14]:
df.groupby('학년').mean() #학년별 평균 데이터
Out[14]:
| 키 | 국어 | 영어 | 수학 | 과학 | 사회 | |
|---|---|---|---|---|---|---|
| 학년 | ||||||
| 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 |
In [17]:
df.groupby('학년').mean().sort_values('키')#학년별 키 오름차순 정렬
Out[17]:
| 키 | 국어 | 영어 | 수학 | 과학 | 사회 | |
|---|---|---|---|---|---|---|
| 학년 | ||||||
| 2 | 182.000000 | 78.333333 | 75.000000 | 68.333333 | 71.666667 | 68.333333 |
| 1 | 187.500000 | 27.500000 | 40.000000 | 40.000000 | 55.000000 | 45.000000 |
| 3 | 194.333333 | 70.000000 | 73.333333 | 81.666667 | 78.333333 | 63.333333 |
In [19]:
df.groupby('학년').mean().sort_values('키', ascending = False) #학년별 키 내림차순 정렬
Out[19]:
| 키 | 국어 | 영어 | 수학 | 과학 | 사회 | |
|---|---|---|---|---|---|---|
| 학년 | ||||||
| 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 |
In [20]:
df.groupby(['학교','학년']).sum()
Out[20]:
| 키 | 국어 | 영어 | 수학 | 과학 | 사회 | ||
|---|---|---|---|---|---|---|---|
| 학교 | 학년 | ||||||
| 능남고 | 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 |
In [21]:
#학교별로 sw특기 개수 확인
df.groupby('학교')['SW특기'].count()
Out[21]:
학교 능남고 3 북산고 3 Name: SW특기, dtype: int64
In [22]:
#학교별로 이름, sw특기 개수 확인
df.groupby('학교')[['이름','SW특기']].count()
Out[22]:
| 이름 | SW특기 | |
|---|---|---|
| 학교 | ||
| 능남고 | 3 | 3 |
| 북산고 | 5 | 3 |
In [26]:
school = df.groupby('학교')
school['학년'].value_counts() #학교로 그룹핑을 한 뒤에 학년별 학생 수를 가져옴
Out[26]:
학교 학년
능남고 2 2
3 1
북산고 1 2
3 2
2 1
Name: 학년, dtype: int64
In [27]:
school['학년'].value_counts().loc['북산고']#학교로 그룹화 한뒤 북산고에 대해서 학년별 학생 수를 가져옴
Out[27]:
학년 1 2 3 2 2 1 Name: 학년, dtype: int64
In [28]:
school['학년'].value_counts().loc['능남고']
Out[28]:
학년 2 2 3 1 Name: 학년, dtype: int64
In [29]:
school['학년'].value_counts(normalize=True).loc['북산고'] #학생들의 수 데이터를 퍼센트로 비교해 가져옴
Out[29]:
학년 1 0.4 3 0.4 2 0.2 Name: 학년, dtype: float64