[Python] GroupBy 분할, 적용, 결합 (aggregate, apply, filter, transform)

2022. 4. 5. 09:53파이썬

# GroupBy 분할, 적용, 결합 (aggregate, apply, filter, transform)

import pandas as pd
df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],
                   'data': range(6)}, columns=['key', 'data'])
df
key data
0 A 0
1 B 1
2 C 2
3 A 3
4 B 4
5 C 5

GroupBy

키 값으로 합치기

df.groupby('key').sum()

[28]:

data1 data2
key
A 3 8
B 5 7
C 7 12

열 인덱싱 지원

import seaborn as sns
planets = sns.load_dataset('planets')
planets.head()
method number orbital_period mass distance year
0 Radial Velocity 1 269.300 7.10 77.40 2006
1 Radial Velocity 1 874.774 2.21 56.95 2008
2 Radial Velocity 1 763.000 2.60 19.84 2011
3 Radial Velocity 1 326.030 19.40 110.62 2007
4 Radial Velocity 1 516.220 10.50 119.47 2009
planets.groupby('method')['orbital_period'].median()
method
Astrometry                         631.180000
Eclipse Timing Variations         4343.500000
Imaging                          27500.000000
Microlensing                      3300.000000
Orbital Brightness Modulation        0.342887
Pulsar Timing                       66.541900
Pulsation Timing Variations       1170.000000
Radial Velocity                    360.200000
Transit                              5.714932
Transit Timing Variations           57.011000
Name: orbital_period, dtype: float64

aggregate()

rng = np.random.RandomState(0)
df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],
                   'data1': range(6),
                   'data2': rng.randint(0, 10, 6)},
                   columns = ['key', 'data1', 'data2'])
df

[16]:

key data1 data2
0 A 0 5
1 B 1 0
2 C 2 3
3 A 3 3
4 B 4 7
5 C 5 9
  • aggregate는 문자열, 함수, 리스트 등을 취해 한 번에 모든 집계를 계산할 수 있다.
  • min = 'min'
df.groupby('key').aggregate(['min', np.median, max])

[17]:

data1 data2
min median max min median max
key
A 0 1.5 3 3 4.0 5
B 1 2.5 4 0 3.5 7
C 2 3.5 5 3 6.0 9

filter

  • 표준편차가 어떤 한계 값보다 큰 그룹을 유지하게 하기
import numpy as np
import pandas as pd

class display(object):
    """Display HTML representation of multiple objects"""
    template = """<div style="float: left; padding: 10px;">
    <p style='font-family:"Courier New", Courier, monospace'>{0}</p>{1}
    </div>"""
    def __init__(self, *args):
        self.args = args

    def _repr_html_(self):
        return '\n'.join(self.template.format(a, eval(a)._repr_html_())
                         for a in self.args)

    def __repr__(self):
        return '\n\n'.join(a + '\n' + repr(eval(a))
                           for a in self.args)

[22]:

def filter_func(x):
    return x['data2'].std() > 4

display('df', "df.groupby('key').std()", "df.groupby('key').filter(filter_func)")

df

key data1 data2
0 A 0 5
1 B 1 0
2 C 2 3
3 A 3 3
4 B 4 7
5 C 5 9

df.groupby('key').std()

data1 data2
key
A 2.12132 1.414214
B 2.12132 4.949747
C 2.12132 4.242641

df.groupby('key').filter(filter_func)

key data1 data2
1 B 1 0
2 C 2 3
4 B 4 7
5 C 5 9

transform 변환

  • 데이터에서 그룹별 평균값을 빼서 분산 셋팅하기
  • agrregate는 groupby데이터를 반환하지만 transform은 재결합을 위해 전체 데이터의 변환된 버전을 반환한다.
df.groupby('key').transform(lambda x: x - x.mean())

[23]:

data1 data2
0 -1.5 1.0
1 -1.5 -3.5
2 -1.5 -3.0
3 1.5 -1.0
4 1.5 3.5
5 1.5 3.0

apply()

  • 임의의 함수를 그룹 결과에 적용할 때 사용
  • DataFrame을 Pandas객체로 변환
def norm_by_data2(x):
    # x is a DataFrame of group values
    x['data1'] /= x['data2'].sum()
    return x

display('df', "df.groupby('key').apply(norm_by_data2)")

[24]:

df

key data1 data2
0 A 0 5
1 B 1 0
2 C 2 3
3 A 3 3
4 B 4 7
5 C 5 9

df.groupby('key').apply(norm_by_data2)

key data1 data2
0 A 0.000000 5
1 B 0.142857 0
2 C 0.166667 3
3 A 0.375000 3
4 B 0.571429 7
5 C 0.416667 9

'파이썬' 카테고리의 다른 글

[python] loc, iloc 차이  (0) 2022.04.07
[Python] Dataframe Column Change  (0) 2022.04.07
[Python] json to dataframe  (0) 2022.04.04
[Python] JSON to dataframe  (0) 2022.04.04
[Python] Colab(코랩)과 로컬 Pycharm 연동하기  (6) 2021.12.08