반응형
Notice
Recent Posts
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Today
Total
관리 메뉴

H-Log

[python] pandas 그룹화 본문

dev-log/python

[python] pandas 그룹화

hong6v6 2023. 1. 17. 18:34
반응형

출처 : 나도코딩 https://www.youtube.com/watch?v=PjhlUzp_cU0&t=10533

동일한 값을 가진 것들끼리 합쳐서 통계 또는 평균 등의 값을 계산하기 위해 진행한다

import pandas as pd

# excel 파일 열기
df = pd.read_excel('score.xlsx', index_col='지원번호')
print(df)

그룹화

  • groupby : 그룹화
df.groupby('학교')
  • get_group(’그룹명’) 그룹 선택
print(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
  • 계산 가능한 데이터들의 평균값
print(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
  • 그룹별 데이터들의 갯수
# 그룹별 데이터(row) 갯수
print(df.groupby('학교').size())
학교
능남고    3
북산고    5
dtype: int64
  • 그룹 중 하나의 값만 불러오기
print(df.groupby('학교').size()['능남고'])
# 3
  • 하나의 데이터만 평균값 구하기
print(df.groupby('학교')['키'].mean())
  • 일부 데이터만 평균값 구하기 : list 삽입
print(df.groupby('학교')[['국어','영어','수학']].mean())

학교별, 학년별로 그룹핑

데이터에 학년을 추가해보자

df['학년'] = [3,3,2,1,1,3,2,2]
이름   학교    키   국어   영어   수학  과학  사회        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

그리고 학교 내에서 학년별로 그룹핑을 해보자

list로 두개의 column제목을 넣으면 된다

print(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

이번엔 학년별로만 그룹핑을 해보자

print(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
  • 정렬

이 상태에서 ‘키’순서로 정렬하고 싶으면 sort_values를 이용해주면 된다

print(df.groupby('학년').mean().sort_values('키'))
    키         국어        영어       수학       과학        사회
학년
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
  • 총 합 구하기
print(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
  • 갯수 세기

SW특기가 있는 학생 세기

print(df.groupby('학교')['SW특기'].count())
학교
능남고    3
북산고    3
Name: SW특기, dtype: int64
  • 학생 수 대비 SW특기가 있는 학생 수 한눈에 보기
print(df.groupby('학교')[['이름', 'SW특기']].count())
       이름  SW특기
학교
능남고   3     3
북산고   5     3
  • 학교로 그룹핑 한 후 학년별 학생 수 세기
school = df.groupby('학교')
print(school['학년'].value_counts())
학교   학년
능남고  2     2
        3     1
북산고  1     2
        3     2
        2     1
Name: 학년, dtype: int64
  • 하나의 학교의 학년별 학생 수 세기
print(school['학년'].value_counts().loc['북산고'])
학년
1    2
3    2
2    1
  • 퍼센테이지로 구하기 : normalize
school['학년'].value_counts(normalize=True).loc['북산고']
학년
1    0.4
3    0.4
2    0.2
반응형

'dev-log > python' 카테고리의 다른 글

[python] Django 가상서버 생성 및 진입  (0) 2023.01.30
[python] pandas 퀴즈  (0) 2023.01.17
[python] pandas 데이터에 함수 적용  (0) 2023.01.17
[python] pandas 데이터 수정  (0) 2023.01.17
[python] pandas 데이터 정렬  (0) 2023.01.17
Comments