[판다스] 그룹화 함수 (groupby)
groupby() 함수는 데이터를 그룹화하여 연산을 수행하는 메서드 입니다.
import pandas as pd
df = pd.read_csv('C:/Users/ /data/gapminder.tsv', sep='\t')
print(df)
판다스를 통해 gapminder.tsv 데이터셋을 출력한다.
print(type(df))
>>> <class 'pandas.core.frame.DataFrame'>
파이썬의 내장함수 type()을 사용하여 실행 결과 df의 자료형이 무엇인지 확인 가능하다.
확인결과 df의 자료형은 DataFrame 객체이다.
1개 열 그룹화하기
df.groupby('year')['lifeExp'].mean()
>>> (출력결과)
year
1952 49.057620
1957 51.507401
1962 53.609249
1967 55.678290
1972 57.647386
1977 59.570157
1982 61.533197
1987 63.212613
1992 64.160338
1997 65.014676
2002 65.694923
2007 67.007423
Name: lifeExp, dtype: float64
연도 'year' 별로 그룹화하고 평균기대수명 'lifeExp' 열의 평균을 나타낸 결과
다중 연산을 하고싶을때 ( agg() )
df.groupby('year')['lifeExp'].agg(['mean','sum'])
>>> (출력결과)
mean sum
year
1952 49.057620 6966.18200
1957 51.507401 7314.05096
1962 53.609249 7612.51336
1967 55.678290 7906.31712
1972 57.647386 8185.92888
1977 59.570157 8458.96236
1982 61.533197 8737.71400
1987 63.212613 8976.19100
1992 64.160338 9110.76800
1997 65.014676 9232.08400
2002 65.694923 9328.67900
2007 67.007423 9515.05400
.agg([ 계산하고 싶은 매서드의 소괄호를 제거한 후 나열 ])
평균값과 합 계산이 들어간것을 확인할 수 있다.
2개 이상 열 그룹화하기 ( 계층화를 제거해주는 reset_index() )
multi_group_var = df.groupby(['year','continent'])[['lifeExp','gdpPercap']].mean()
print(multi_group_var)
>>> (출력결과)
lifeExp gdpPercap
year continent
1952 Africa 39.135500 1252.572466
Americas 53.279840 4079.062552
Asia 46.314394 5195.484004
Europe 64.408500 5661.057435
Oceania 69.255000 10298.085650
1957 Africa 41.266346 1385.236062
Americas 55.960280 4616.043733
Asia 49.318544 5787.732940
Europe 66.703067 6963.012816
Oceania 70.295000 11598.522455
...
2007 Africa 54.806038 3089.032605
Americas 73.608120 11003.031625
Asia 70.728485 12473.026870
Europe 77.648600 25054.481636
Oceania 80.719500 29810.188275
'multi_group_var' 변수생성 후 연도 'year' 과 대륙' continent' 열을 그룹화시킨 후 평균기대수명 'lifeExp' 와 GDP 평균 'gdpPercap' 열의 평균을 계산해준다.
출력결과를 보면 'year' 와 'continent' 열이 계층을 이루며 구성되었다는 점이다.
이러한 계층구조를 없애고 데이터프레임을 평탄화하고 싶다면 reset_index() 메서드를 사용한다.
print(multi_group_var.reset_index())
>>> (출력결과)
year continent lifeExp gdpPercap
0 1952 Africa 39.135500 1252.572466
1 1952 Americas 53.279840 4079.062552
2 1952 Asia 46.314394 5195.484004
3 1952 Europe 64.408500 5661.057435
4 1952 Oceania 69.255000 10298.085650
5 1957 Africa 41.266346 1385.236062
6 1957 Americas 55.960280 4616.043733
7 1957 Asia 49.318544 5787.732940
8 1957 Europe 66.703067 6963.012816
9 1957 Oceania 70.295000 11598.522455
...
56 2007 Americas 73.608120 11003.031625
57 2007 Asia 70.728485 12473.026870
58 2007 Europe 77.648600 25054.481636
59 2007 Oceania 80.719500 29810.188275
그룹화한 데이터 개수 세기 ( nunique(), value_counts() )
데이터 분석에서 평균만큼 개수를 구하는 일이 많다. 통계에서는 이를 빈도수라 부르기도 한다.
nunique() 메서드는 중복을 제외한 개수를 구해준다.
multi_group_var.reset_index().nunique()
>>>
year 12
continent 5
lifeExp 60
gdpPercap 60
dtype: int64
이와 달리 value_counts() 메서드는 지정한 열이나 행의 개수( 빈도수 )를 구한다.
df.groupby('year')['lifeExp'].value_counts()
>>>
year lifeExp
1952 28.801 1
30.000 1
30.015 1
30.331 1
31.286 1
..
2007 81.235 1
81.701 1
81.757 1
82.208 1
82.603 1
Name: count, Length: 1700, dtype: int64
또다른 예제를 위해 데이터프레임을 만들어준다.
df = pd.DataFrame({'c1' : ['a','a','b','b','c','d','b'],
'c2' : ['A','B','B','A','D','C','C'],
'c3' : np.random.randint(7),
'c4' : np.random.random(7)})
print(df)
>>>
c1 c2 c3 c4
0 a A 5 0.139194
1 a B 5 0.874303
2 b B 5 0.173516
3 b A 5 0.839289
4 c D 5 0.568742
5 d C 5 0.005906
6 b C 5 0.183771
a = df['c3'].groupby(df['c1']).mean()
print(a)
>>>
c1
a 5.0
b 5.0
c 5.0
d 5.0
Name: c3, dtype: float64
6행 4열 짜리 데이터프레임을 만든 후 a라는 변수에 담아준다.
a변수는 데이터프레임에서 데이터값으로 'c3'열만 사용하고 그 데이터값의 평균을 구하는데, 'c1'열로 그룹화를 하겠다는 의미이다.
본 내용의 일부는 '이지스퍼블리싱의 데이터 분석을 위한 판다스 입문' 의 내용을 포함하고 있습니다.