DataAnalysis/Pandas

[판다스] 그룹화 함수 (groupby)

2wnswoo 2024. 8. 30. 21:24

groupby() 함수는 데이터를 그룹화하여 연산을 수행하는 메서드 입니다.

 

import pandas as pd
df = pd.read_csv('C:/Users/ /data/gapminder.tsv', sep='\t')
print(df)

 

판다스를 통해 gapminder.tsv 데이터셋을 출력한다.

 

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'열로 그룹화를 하겠다는 의미이다.

 

본 내용의 일부는 '이지스퍼블리싱의 데이터 분석을 위한 판다스 입문' 의 내용을 포함하고 있습니다.