Ch10. 데이터 집계와 그룹 연산
groupby
하나 이상의 키 (함수, 배열, DataFrame의 컬럼 이름)을 이용해서 pandas 객체를 여러 조각으로 나누는 방법
합계, 평균, 표준편차, 사용자 정의 함수 같은 그룹 요약 통계를 계산하는 방법
정규화, 선형회귀, 등급 또는 부분집합 선택 같은 집단 내 변형이나 다른 조작을 적용하는 방법
피벗테이블과 교차알람표를 구하는 방법
변위치 분석과 다른 통계 집단 분석 수행 방법
그룹 연산
1) 분리 : Series, DataFrame 같은 pandas 객체나 다른 객체에 들어있는 데이터를 하나 이상의 키를 기준으로 분리 2) 적용 : 분리하고나서 함수를 각 그룹에 적용시켜 새로운 값을 얻어낸다 3) 결합 : 함수를 적용한 결과를 하나의 객체로 결합
import pandas as pd
import numpy as np
df=pd.DataFrame({'key1':['a','a','b','b','a'],
'key2':['one','two','one','two','one'],
'data1':np.random.randn(5),
'data2':np.random.randn(5)})
--1번 --
df
--그룹화하기
grouped=df['data1'].groupby(df['key1'])
grouped
Out[6]: pandas.core.groupby.generic.SeriesGroupBy object at 0x000001C1DB1EA8C8>
--2번--
grouped.mean()
--3번--
means=df['data1'].groupby([df['key1'],df['key2']]).mean()
means

그룹간 순회하기 groupby 객체는 이터레이션을 지원하는데, 그룹 이름과 그에 따른 데이터 묶음을 튜플로 변환 색인이 여럿 존재하는 경우 튜플의 첫번 원소개 색인값이 된다
for (k1, k2), group in df.groupby (['key1','key2']):
print(k1,k2)
print(group)
>>
a one
key1 key2 data1 data2
0 a one -0.024626 2.001824
4 a one -0.031818 -2.083315
a two
key1 key2 data1 data2
1 a two -0.535523 -0.28868
b one
key1 key2 data1 data2
2 b one -0.727394 -1.257175
b two
key1 key2 data1 data2
3 b two 0.771112 2.316629
print(k1,k2) --만 했을 때
>>
a one
a two
b one
b two
그룹별 데이터를 사전형으로 바꿔서 원하는 데이터만 골라낼 수 있다
ex) pieces = dict(list(df.groupby('key1)))
df데이터 중에서 data2 컬럼에 대해서만 평균을 구하고 싶을 때
df.groupby(['key1', 'key2'])[['data2]].mean
컬럼값을 가지고 매핑할수도 있다. 함수(ex- len) , 색인 단계로 그룹핑할 수 있다. 이 기능 사용하려면 level 예약어를 사용해서 레벨 번호나 이름을 넘기면 된다.
데이터 집계
count, sum, mean, median, std, var, min, max, prod, first, last 등등
--df는 위에 있는 df 사용
grouped = df.groupby('key1')
def peak_to_peak(arr):
return arr.max()-arr.min()
grouped.agg(peak_to_peak)
>>
data1 data2
key1
a 0.745491 0.773204
b 0.177349 0.762043
컬럼마다 다른 함수를 적용하고 싶을 때, agg 메서드에 컬럼 이름에 대응하는 함수가 들어있는 사전을 넘긴다
ex) grouped.agg({'data1':np.max,'data2':sum})
색인되지 않은 형태로 집계된 데이터 반환하려면 as_index = False 를 넘겨서 색인되지 않도록 할 수 있다
Apply
시리즈 s에서 null 값을 평균값으로 대체하기
ex)
s=pd.Series(np.random.randn(6))
s[: : 2]=np.nan
s.fillna(s.mean())
Last updated
Was this helpful?