본문 바로가기

데이터분석 with 파이썬/pandas와 Numpy

2. <Pandas> Group 간에 함수적용하기 agg()

데이터 수집
In [2]:
#본 실습내용은 출판사 O'REILLY의 Pyton for Data Analisys를 참고하여 만들었음을 말씀드립니다. 
from numpy.random import randn
import numpy as np
import os
import matplotlib.pyplot as plt
from pandas import Series, DataFrame
import pandas as pd
In [6]:
tips = pd.read_csv('tips.csv')
tips = tips.sample(10)
tips
Out[6]:
total_bill tip sex smoker day time size
111 7.25 1.00 Female No Sat Dinner 1
134 18.26 3.25 Female No Thur Lunch 2
225 16.27 2.50 Female Yes Fri Lunch 2
103 22.42 3.48 Female Yes Sat Dinner 2
88 24.71 5.85 Male No Thur Lunch 2
100 11.35 2.50 Female Yes Fri Dinner 2
227 20.45 3.00 Male No Sat Dinner 4
65 20.08 3.15 Male No Sat Dinner 3
229 22.12 2.88 Female Yes Sat Dinner 2
28 21.70 4.30 Male No Sat Dinner 2

데이터 수집

최적화된 groupby 메서드[표9-1] 358p

  1. 칼럼에 여러 가지 함수 적용하기
  2. 색인되지 않은 형태로 집계된 데이터 반환하기¶ In [29]:

1. 칼럼에 여러 가지 함수 적용하기

In [7]:
tips['tip_rate'] = tips['tip']/tips['total_bill']*100
tips
Out[7]:
total_bill tip sex smoker day time size tip_rate
111 7.25 1.00 Female No Sat Dinner 1 13.793103
134 18.26 3.25 Female No Thur Lunch 2 17.798467
225 16.27 2.50 Female Yes Fri Lunch 2 15.365704
103 22.42 3.48 Female Yes Sat Dinner 2 15.521855
88 24.71 5.85 Male No Thur Lunch 2 23.674626
100 11.35 2.50 Female Yes Fri Dinner 2 22.026432
227 20.45 3.00 Male No Sat Dinner 4 14.669927
65 20.08 3.15 Male No Sat Dinner 3 15.687251
229 22.12 2.88 Female Yes Sat Dinner 2 13.019892
28 21.70 4.30 Male No Sat Dinner 2 19.815668
In [9]:
groupedBysex_smoke = tips.groupby(['sex','smoker'])  #sex 와 smoker 로 그룹화!
In [10]:
groupedBysex_smoke['tip_rate'].agg('mean')  # 팁 비율에 대한 함수를 적용하고 할 때 agg() 함수를 사용하자.
# agg()는 내가 만든 함수도 사용할 수 있다는 장점이 있다.기본 내장함수를 사용한다면 필요하진 않다.                                         
Out[10]:
sex     smoker
Female  No        15.795785
        Yes       16.483471
Male    No        18.461868
Name: tip_rate, dtype: float64
In [11]:
def max_to_min (arr):   # 내가 함수를 만들어보자. 최대값과 최소값의 차이를 반환하는 함수이다. 
    return arr.max()-arr.min()
In [12]:
groupedBysex_smoke['tip_rate'].agg(max_to_min) 
Out[12]:
sex     smoker
Female  No        4.005363
        Yes       9.006540
Male    No        9.004699
Name: tip_rate, dtype: float64

여러개의 함수 한번에 적용하기

In [13]:
groupedBysex_smoke['tip_rate'].agg(['mean','std',max_to_min]) # agg에 리스트로 여러 함수를 넣어주면 된다. 
Out[13]:
mean std max_to_min
sex smoker
Female No 15.795785 2.832219 4.005363
Yes 16.483471 3.868458 9.006540
Male No 18.461868 4.126457 9.004699

함수적용 컬럼의 이름 부여하기

In [14]:
groupedBysex_smoke['tip_rate'].agg([('jjang','mean'),('jjong',max_to_min)]) 
# agg안에 (이름, 적용함수) 형태의 튜플로 리스트안에 담아주면 함수결과값의 이름을 반영해준다. 
Out[14]:
jjang jjong
sex smoker
Female No 15.795785 4.005363
Yes 16.483471 9.006540
Male No 18.461868 9.004699

사전객체를 agg에 적용하여 하나의 칼럼에 여러 함수 적용하기

In [16]:
groupedBysex_smoke.agg({'tip_rate':['mean','sum','std',max_to_min], 'size':['sum','mean']})
# tip_rate이라는 칼럼에는 평균,합,표준편차,최대최소차이를 적용하고 size에 대해선 합과 평균을 적용해라.
Out[16]:
tip_rate size
mean sum std max_to_min sum mean
sex smoker
Female No 15.795785 31.591570 2.832219 4.005363 3 1.50
Yes 16.483471 65.933882 3.868458 9.006540 8 2.00
Male No 18.461868 73.847472 4.126457 9.004699 11 2.75

2. 색인되지 않은 형태로 집계된 데이터 반환하기

In [20]:
groupedBysex_smoke.mean()  # 현재 sex와 smoker 그룹화되어 항상 인덱스에 sex와 smoker가 들어가게되는데
# 이를 지울 수는 없을까? DF안에 data로 들어가게 할 수는 없을까? 있다. (답정너)
Out[20]:
total_bill tip size tip_rate
sex smoker
Female No 12.755 2.125 1.50 15.795785
Yes 18.040 2.840 2.00 16.483471
Male No 21.735 4.075 2.75 18.461868
In [22]:
# 그룹화할때 as_index를 False로 해준다면 그룹화기준이 되는 키도 하나의 값으로써 들어가게 된다. 
groupedBysex_smoke = tips.groupby(['sex','smoker'],as_index=False)
groupedBysex_smoke.mean()
Out[22]:
sex smoker total_bill tip size tip_rate
0 Female No 12.755 2.125 1.50 15.795785
1 Female Yes 18.040 2.840 2.00 16.483471
2 Male No 21.735 4.075 2.75 18.461868
In [ ]: