5 분 소요

Group by

pandas에선 SQL의 group by 절의 기능을 함수로서 제공한다.

기본 사용법

import pandas as pd

df = pd.read_csv("/content/drive/MyDrive/경기도_수원시_반려동물현황_20210930.csv", encoding='cp949')

우선 csv 데이터 파일을 불러온다.

df.head()
시도명 시군구명 구청명 법정동명 등록품종수 등록개체수 소유자수 관리부서명 관리부서연락처 데이터기준일자
0 경기도 수원시 권선구 탑동 67 1486 1100 권선구 경제교통과 031-228-6373 2021-09-30
1 경기도 수원시 권선구 평동 26 140 110 권선구 경제교통과 031-228-6373 2021-09-30
2 경기도 수원시 권선구 고색동 53 999 745 권선구 경제교통과 031-228-6373 2021-09-30
3 경기도 수원시 권선구 구운동 68 1523 1184 권선구 경제교통과 031-228-6373 2021-09-30
4 경기도 수원시 권선구 권선동 94 5132 3940 권선구 경제교통과 031-228-6373 2021-09-30

가져온 데이터는 공공 데이터 포털경기도 수원시 반려동물 현황 데이터 파일이다.
우선 자료를 보면 각 행은 동을 기준으로 나누어져 등록품종수,개체수,소유자수의 칼럼 속성 값을 가지고 있다.
여기서 ‘동’이 아닌 ‘구’로 묶어서 데이터를 집계하고자 한다.

필터링을 이용한 방법

df[df['구청명']=='권선구'][['등록품종수','등록개체수','소유자수']].sum()
#df[df['구청명']=='장안구'][['등록품종수','등록개체수','소유자수']].sum()
#df[df['구청명']=='팔달구'][['등록품종수','등록개체수','소유자수']].sum()

등록품종수      802
등록개체수    22068
소유자수     16537
dtype: int64

위의 코드로 데이터의 집계를 구할 수 있다.
하지만 보다시피 코드가 지저분하다.
명령을 각 값마다 한줄한줄 줘야 하다보니 데이터가 많을 때의 효율도 매우 좋지 못하다.

이럴 때 group by를 사용하면 아주 손 쉽게 원하는 값의 집계 데이터를 만들 수 있다.

group by를 사용한 방법

df_group_1=df.groupby("구청명").sum()
df_group_1



등록품종수 등록개체수 소유자수
구청명
권선구 802 22068 16537
영통구 491 17641 14028
장안구 593 16052 12471
팔달구 774 12546 9304
df_group_2=df.groupby("구청명").mean()
df_group_2
등록품종수 등록개체수 소유자수
구청명
권선구 53.466667 1471.200000 1102.466667
영통구 70.142857 2520.142857 2004.000000
장안구 53.909091 1459.272727 1133.727273
팔달구 35.181818 570.272727 422.909091

group by를 통해 훨신 편하고 빠르게 원하는 집계 데이터를 추출하였다.
기본적인 사용 법은 df.groupby(‘그룹화될 칼럼명’).집계함수() 의 구조로 사용할 수 있다.
SQL과 마찬가지로 일반적인 상황에서 groupby는 혼자 사용되기보단 집계함수와 같이 사용 된다.
집계함수 없이 단독으로 사용했을 경우 DataFrame의 형태가 아닌 groupby 객체로서 저장된다.

df_group_3=df.groupby("구청명")
df_group_3.groups
{'권선구': [0, 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, 31, 32], '팔달구': [33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54]}

집계함수 없이 데이터를 그룹핑 했을 경우 위와 같이 .groups 을 통해 데이터의 구조를 파악할 수 있다.
그룹화된 값에 어떤 행들이 들어가 있는지를 해당 행의 인덱스를 통해 보여준다.

for 구청명, group in df_group_3:
  print(구청명+" : "+ str(len(group)))
  print(group)
  print( )
권선구 : 15
    시도명 시군구명  구청명  법정동명  ...  소유자수      관리부서명       관리부서연락처     데이터기준일자
0   경기도  수원시  권선구    탑동  ...  1100  권선구 경제교통과  031-228-6373  2021-09-30
1   경기도  수원시  권선구    평동  ...   110  권선구 경제교통과  031-228-6373  2021-09-30
2   경기도  수원시  권선구   고색동  ...   745  권선구 경제교통과  031-228-6373  2021-09-30
3   경기도  수원시  권선구   구운동  ...  1184  권선구 경제교통과  031-228-6373  2021-09-30
4   경기도  수원시  권선구   권선동  ...  3940  권선구 경제교통과  031-228-6373  2021-09-30
5   경기도  수원시  권선구   금곡동  ...  1798  권선구 경제교통과  031-228-6373  2021-09-30
6   경기도  수원시  권선구   당수동  ...   342  권선구 경제교통과  031-228-6373  2021-09-30
7   경기도  수원시  권선구   서둔동  ...   746  권선구 경제교통과  031-228-6373  2021-09-30
8   경기도  수원시  권선구   세류동  ...  2750  권선구 경제교통과  031-228-6373  2021-09-30
9   경기도  수원시  권선구   입북동  ...   276  권선구 경제교통과  031-228-6373  2021-09-30
10  경기도  수원시  권선구   장지동  ...    12  권선구 경제교통과  031-228-6373  2021-09-30
11  경기도  수원시  권선구   평리동  ...     3  권선구 경제교통과  031-228-6373  2021-09-30
12  경기도  수원시  권선구  곡반정동  ...  1116  권선구 경제교통과  031-228-6373  2021-09-30
13  경기도  수원시  권선구  오목천동  ...   886  권선구 경제교통과  031-228-6373  2021-09-30
14  경기도  수원시  권선구  호매실동  ...  1529  권선구 경제교통과  031-228-6373  2021-09-30

[15 rows x 10 columns]

영통구 : 7
    시도명 시군구명  구청명 법정동명  등록품종수  등록개체수  소유자수      관리부서명       관리부서연락처     데이터기준일자
15  경기도  수원시  영통구   신동     37    293   225  영통구 경제교통과  031-228-8881  2021-09-30
16  경기도  수원시  영통구   하동     63   1497  1098  영통구 경제교통과  031-228-8881  2021-09-30
17  경기도  수원시  영통구  망포동     73   2515  2052  영통구 경제교통과  031-228-8881  2021-09-30
18  경기도  수원시  영통구  매탄동     93   5195  4088  영통구 경제교통과  031-228-8881  2021-09-30
19  경기도  수원시  영통구  영통동     83   4077  3372  영통구 경제교통과  031-228-8881  2021-09-30
20  경기도  수원시  영통구  원천동     64   1625  1249  영통구 경제교통과  031-228-8881  2021-09-30
21  경기도  수원시  영통구  이의동     78   2439  1944  영통구 경제교통과  031-228-8881  2021-09-30

장안구 : 11
    시도명 시군구명  구청명  법정동명  ...  소유자수      관리부서명       관리부서연락처     데이터기준일자
22  경기도  수원시  장안구   송죽동  ...  1070  장안구 경제교통과  031-228-5384  2021-09-30
23  경기도  수원시  장안구   연무동  ...   872  장안구 경제교통과  031-228-5384  2021-09-30
24  경기도  수원시  장안구   영화동  ...  1074  장안구 경제교통과  031-228-5384  2021-09-30
25  경기도  수원시  장안구   율전동  ...  1074  장안구 경제교통과  031-228-5384  2021-09-30
26  경기도  수원시  장안구   이목동  ...   252  장안구 경제교통과  031-228-5384  2021-09-30
27  경기도  수원시  장안구   정자동  ...  3647  장안구 경제교통과  031-228-5384  2021-09-30
28  경기도  수원시  장안구   조원동  ...  2370  장안구 경제교통과  031-228-5384  2021-09-30
29  경기도  수원시  장안구   천천동  ...  1146  장안구 경제교통과  031-228-5384  2021-09-30
30  경기도  수원시  장안구   파장동  ...   944  장안구 경제교통과  031-228-5384  2021-09-30
31  경기도  수원시  장안구  상광교동  ...     5  장안구 경제교통과  031-228-5384  2021-09-30
32  경기도  수원시  장안구  하광교동  ...    17  장안구 경제교통과  031-228-5384  2021-09-30

[11 rows x 10 columns]

팔달구 : 22
    시도명 시군구명  구청명   법정동명  ...  소유자수      관리부서명       관리부서연락처     데이터기준일자
33  경기도  수원시  팔달구     교동  ...   126  팔달구 경제교통과  031-228-7355  2021-09-30
34  경기도  수원시  팔달구     영동  ...    24  팔달구 경제교통과  031-228-7355  2021-09-30
35  경기도  수원시  팔달구     중동  ...    21  팔달구 경제교통과  031-228-7355  2021-09-30
36  경기도  수원시  팔달구     지동  ...   728  팔달구 경제교통과  031-228-7355  2021-09-30
37  경기도  수원시  팔달구    고등동  ...   631  팔달구 경제교통과  031-228-7355  2021-09-30
38  경기도  수원시  팔달구    구천동  ...    54  팔달구 경제교통과  031-228-7355  2021-09-30
39  경기도  수원시  팔달구    남수동  ...    63  팔달구 경제교통과  031-228-7355  2021-09-30
40  경기도  수원시  팔달구    남창동  ...    71  팔달구 경제교통과  031-228-7355  2021-09-30
41  경기도  수원시  팔달구    매교동  ...   273  팔달구 경제교통과  031-228-7355  2021-09-30
42  경기도  수원시  팔달구    매향동  ...    61  팔달구 경제교통과  031-228-7355  2021-09-30
43  경기도  수원시  팔달구    북수동  ...    87  팔달구 경제교통과  031-228-7355  2021-09-30
44  경기도  수원시  팔달구    신풍동  ...    93  팔달구 경제교통과  031-228-7355  2021-09-30
45  경기도  수원시  팔달구    우만동  ...  1742  팔달구 경제교통과  031-228-7355  2021-09-30
46  경기도  수원시  팔달구    인계동  ...  2408  팔달구 경제교통과  031-228-7355  2021-09-30
47  경기도  수원시  팔달구    장안동  ...    62  팔달구 경제교통과  031-228-7355  2021-09-30
48  경기도  수원시  팔달구    화서동  ...  2236  팔달구 경제교통과  031-228-7355  2021-09-30
49  경기도  수원시  팔달구  매산로1가  ...    99  팔달구 경제교통과  031-228-7355  2021-09-30
50  경기도  수원시  팔달구  매산로2가  ...   281  팔달구 경제교통과  031-228-7355  2021-09-30
51  경기도  수원시  팔달구  매산로3가  ...   169  팔달구 경제교통과  031-228-7355  2021-09-30
52  경기도  수원시  팔달구  팔달로1가  ...    16  팔달구 경제교통과  031-228-7355  2021-09-30
53  경기도  수원시  팔달구  팔달로2가  ...    32  팔달구 경제교통과  031-228-7355  2021-09-30
54  경기도  수원시  팔달구  팔달로3가  ...    27  팔달구 경제교통과  031-228-7355  2021-09-30

[22 rows x 10 columns]

위의 반복문을 통해 group by 객체의 정보를 시각적으로 보기 좋기 표현할 수 있다.

df_group_4=df.groupby(["구청명","법정동명"]).sum()
df_group_4.head()
등록품종수 등록개체수 소유자수
구청명 법정동명
권선구 고색동 53 999 745
곡반정동 67 1583 1116
구운동 68 1523 1184
권선동 94 5132 3940
금곡동 71 2334 1798

적절한 데이터를 가져오지 못해서 차이를 잘 보여줄 순 없지만 암튼 위의 방식대로 다수의 그룹화가 가능하다.

댓글남기기