Pandas groupby
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 |
적절한 데이터를 가져오지 못해서 차이를 잘 보여줄 순 없지만 암튼 위의 방식대로 다수의 그룹화가 가능하다.
댓글남기기