[판다스] 그룹핑

밍키·2020년 8월 13일
0

판다 판다 판다스

목록 보기
9/12

1. groupby


  • 특정 열을 기준으로 데이터셋을 묶는다.
  • ~~ 별 집계를 할 때 사용한다.
  • 구문
    • DF.groupby('그룹으로묶을기준컬럼')['집계할 컬럼'].집계함수()
      • 집계할 컬럼은 Fancy Indexing 으로 지정(리스트, 튜플로 전달)
  • 집계함수
    • 기술통계 함수들
    • agg() / aggregate()
      • 여러 다른 집계함수 호출시(여러 집계를 같이 볼경우)
      • 사용자정의 집계함수 호출시
      • 컬럼별로 다른 집계함수들을 호출할 경우

1.1 그룹핑해서 집계하는 법


  • 방법
    1. 가장 많이 쓰이는 것은 마지막 집계함수를 직접 호출 하는 것
    2. 한번에 여러개의 집계함수를 호출 할 경우는 agg([리스트]) 를 사용한다.
    3. 열별로 다른 집계를 하는 경우 dict를 사용한다.
# 그룹바이
grouped = flights.groupby('AIRLINE')
grouped.groups # 잘 쓰지 않지만, 어떤 식으로 그룹지어졌는지 보려고
# 각 값의 인덱스를 가지고 있다.

# 집계 대상 선택
flights.groupby('AIRLINE')['ARR_DELAY'].mean()
# 에어라인별로 평균 도착 지연시간

# 두 개 이상의 컬럼 선택
flights.groupby('AIRLINE')[['DEP_DELAY','ARR_DELAY']].mean()
# 인덱스 명은 고유값이 나옴.

# 팬시 인덱싱 안하면 경고 나옴 ㄷㄷㄷ
# 경고가 나온다면 조만간 없어진다는 뜻. will be deprecated

# 합계
flights.groupby('AIRLINE')[['DEP_DELAY','ARR_DELAY']].sum()

# 합쳐서 agg
stat = flights.groupby('AIRLINE')[['DEP_DELAY','ARR_DELAY']].agg(['sum', 'mean', 'median'])
stat

# 멀티 인덱스 조회하기
stat['ARR_DELAY']

# 멀티 인덱스 안에 인덱스를 조회하기
# A.D 밑에 sum 조회
stat['ARR_DELAY']['sum']
stat['ARR_DELAY','sum']
# 둘 다 가능하다.

# 컬럼마다 집계하는 함수가 다를 때
# agg 안에서 딕셔너리로 해결
flights.groupby('AIRLINE').agg({'DEP_DELAY':'sum',
                                'ARR_DELAY':'sum',
                                'AIR_TIME':'mean'})

1.1.1 복수열 기준 그룹핑

  • 두개 이상의 열을 그룹으로 묶을 수 있다.
  • groupby의 매개변수에 그룹으로 묶을 컬럼들의 이름을 리스트로 전달한다.
# 두 개 이상의 열로 그룹묶기
# 출발공항, 도착공항
flights.groupby(['ORG_AIR', 'DEST_AIR'])['ARR_DELAY'].mean()

# 딕셔너리 이용해서 agg
dic = {
    'ARR_DELAY':['sum','mean'],
    'AIR_TIME':['mean','std']
}
stat2 = flights.groupby(['ORG_AIR', 'DEST_AIR']).agg(dic)
stat2
# 컬럼도 멀티 인덱스, 인덱스도 멀티 인덱스

# stat2의 AIR_TIME 조회
stat2['AIR_TIME'].head()

# stat2의 AIR_TIME의 평균만 보고싶을 때
stat2['AIR_TIME','mean'].head()

# 인덱스가 ATL인 것
stat2.loc['ATL']

# 인덱스가 ATL의 ABE
stat2.loc['ATL','ABE']

1.1.2 goupby 집계후 집계한 것 중 특정 조건의 항목만 보기

  • SQL having 절
  • 집계 후 boolean indexing으로 having절 처리5 사용자 정의 집계함수를 만들어 적용
# 취소된 전체 건 수
flights['CANCELLED'].value_counts()

# 항공사별 취소
stat3 = flights.groupby('AIRLINE')['CANCELLED'].sum()
stat3

# 100건 이상 취소된 항공사만 보기
stat3[stat3>100]
# 이거는 변수에 넣어놓고 하는게 맞다. 너무 복잡

1.2 사용자 정의 집계함수를 만들어보기


1.2.1 사용자 정의 집계 함수 정의

  • 매개변수
    1. Series 또는 DataFrame을 받을 매개변수(필수)
    2. 필요한 값을 받을 매개변수를 선언한다. (선택)

1.2.2 agg()를 사용해 사용자 정의 집계 함수 호출

  • DataFrame.agg(func=None, axis=0, \*args, \*\*kwargs)

    • axis : 사용자 정의 함수에 전달할 값들(Series)의 축 지정
  • Series.agg(func=None, axis=0, \*args, \*\*kwargs)

    • DataFrame의 agg와 매개변수 구조를 맞추기 위해 axis 지정한다.
  • SeriesGroupBy.agg(func=None, \*args, \*\*kwargs)

    • axis 지정안함
    • 사용자 함수에 Series를 group 별로 전달한다.
  • DataFrameGroupBy.agg(func, \*args, \*\*kwargs)

    • axis 지정안함.
    • 사용자 함수에 Series를 group 별로 전달한다.
  • *args, **kwargs는 사용자 정의 함수에 선언한 매개변수가 있을 경우 전달할 값을 전달한다.

# 최대 값과 최소 값의 차이를 집계하는 함수
def max_min_diff(x):
    '''
    [매개변수]
        x : Series - 집계대상
    '''
    return x.max() - x.min()
    
    
# 직접 만든 함수 사용해보기
max_min_diff(flights['ARR_DELAY'])

# a.max() - 객체 지향적 방식

# flights['ARR_DELAY'].max_min_diff() # 오류 발생
# 이거는 내가 만든거라 안됨.
# 이 때! agg 사용
flights['ARR_DELAY'].agg(max_min_diff)
# 이건 문자열로 넘기면 안된다.

# agg 쓰던지, 직접 넣던지 둘 중에 하나.

# 다른 함수랑 묶어서 보고싶을 때는 agg 를 사용한다.
flights['ARR_DELAY'].agg(['min','max',max_min_diff])

# 그룹바이로 사용하기
flights.groupby('AIRLINE')['ARR_DELAY'].agg(['max','min',max_min_diff])


# 매개변수가 있는 사용자 정의 집계 함수.
# 추가적인 대상이 더 필요함.
def check_max(x, threshold):
    '''
    x의 최대값이 threshold 이상인지 체크
    [매개변수]
        x : Series - 집계대상
        threshold : int - 최댓값과 비교할 정수
    [반환값]
        boolean 불리언 값으로 반환.
    '''
    return x.max()>=threshold

# 필요에 따라서 내가 함수를 만들어서 사용할 수 있다.

flights['ARR_DELAY'].max()

check_max(flights['ARR_DELAY'], 2000)

# agg에 이용해보기
flights['ARR_DELAY'].agg(check_max, 0, 2000) # 헷갈릴 거 같아?
# 축을 바꿀 때는 이걸 쓰자.

# 보통 거의 열 단위로 집계하기 때문에
# kwargs를 쓰자
# threshold=2000
flights['ARR_DELAY'].agg(check_max, threshold=2000)

# groupby
flights.groupby('AIRLINE')['ARR_DELAY'].agg(check_max, threshold=800)
# 두 개 이상은 묶어서 할 수 없음.
# 함수 만들 때 x를 시리즈가 아니라 데이터 프레임을 기준으로 만들어야된다.
profile
대한민국 4차 산업의 역군을 꿈꾸며.

0개의 댓글